《SIFT个人总结》由会员分享,可在线阅读,更多相关《SIFT个人总结(14页珍藏版)》请在金锄头文库上搜索。
1、sift.h 文件参考文件参考检测 SIFT 图像功能。#include“cxcore.h”算法步骤:算法步骤:1.建立尺度空间建立尺度空间为了让尺度体现其连续性,在简单降采样的基础上加上了高斯滤波。一幅 图像可以产生几组(octave)图像,一组图像包括几层(interval)图像。 22221()(),exp22ii iixxyyG x yOctave 1Octave 2Octave 3Octave 4Octave 5248 2.寻找极值点寻找极值点3.去除不稳定的极值点(低对比度)去除不稳定的极值点(低对比度)利用公式 确定精确定位后的极值点的像素值,进行对比度的检测。若像素值满足大于
2、contr_thr / intvls(程序中为 0.04/3) ,则该点才能最终确定为极值点。4.去除边界影响点去除边界影响点使用 Hessian 矩阵去除边界影响点:1 2TDD XDXXxxxyxyyyDDHDD如果该点满足则保留,否则被排除 为最大特征值, 为最小的特征值 ,在程序中 r=10.5.特征点方向特征点方向计算公式:scl_octv = *2.0 intvl / intvls,式中: scl_octv 为关键点的尺度, intvl 为关键点在高斯差分金字塔中所处于的层数以关键点为中心,划定一个邻域,利用所有在此区域内的点的梯度形成一个方向直方 图。偏移为 rad 的正方形区域
3、,rad=四舍五入(3*1.5* scl_octv ),IIgradI x yxy22,1,1,1,1m x yL xyL xyL x yL x y 1,1,1,tan1,1,L x yL x yx yL xyL xy梯度加权系数 w 的确定: w = exp( -( i*i + j*j )/exp_denom ),每个像素点的梯度值都必须乘以该点所对应的高斯权,这样才能得到最终的梯度值。根据 Lowe 的建议,模板采用0.25,0.5,0.25,并连 续加权两次。生成含有 36 柱的方向直方图,梯度直方图范围 0360 度,其中每 10 度一个柱。由半 径为图像区域生成 对方向直方图进行两次
4、平滑 求取关键点方向(可能是多个方向) 对方向直方图的 Taylor 展开式进行二次曲线拟合,精确关键点方向6.特征点描述特征点描述描述子采用 448128 维向量表征,综合效果最优(不变性与独特性) 。程序中 histhistSIFT_DESCR_WIDTH SIFT_DESCR_WIDTH SIFT_DESCR_HIST_BINS 最终以一维数组保存在 feature 数据结构宏SIFT_INTVLS 3每组 octave 的取样间隔 SIFT_SIGMA 1.6默认情况下,初始高斯平滑的标准差 sigma SIFT_CONTR_THR 0.04默认阈值,像素灰度值范围0,1。去除那些对比
5、度较低的不稳定极值点。SIFT_CURV_THR 10关键点的原则曲率比,默认阈值,去除边界点影响点SIFT_IMG_DBL 1双倍图像大小后再金字塔? SIFT_DESCR_WIDTH 4描述符直方图数组的默认宽度 SIFT_DESCR_HIST_BINS 8描述符阵列中每个直方图的默认 bin 数 函数文档int sift_features(IplImage * img, struct feature * feat)查找图像中 SIFT 特征。使用默认参数值,参见以上宏定义。int _sift_features(IplImage * img,struct feature * feat,in
6、t intvls,double sigma,double contr_thr,int curv_thr,int img_dbl,int descr_width,int descr_hist_bins )参数参数IMG被检测的图像。OpenCVstruct feature * 返回特征点的数据结构,采用连续存放的数组结构。Intvls每组 octave 的尺度空间采样的间隔数。sigma建立 octave 金字塔时使用的高斯平滑量。contr_thr尺度空间过程的一个评价参数阈值, 是一个向量, 确定特征位置和尺度大小。该阈值用于去掉不稳定的特性点, 假定像素值的范围是0,1。curv_thr去
7、除边界点影响点中的参数。img_dbl是否双倍图像大小后再建立尺度空间?1 是,0 否。descr_width使用宽度的阵列计算直方图方向,用于计算特征描 述符。descr_hist_bins每个阵列中的用于计算的特征的描述符的直方图的方向数。返回返回 返回的特征点数据的大小feature 数据结构 表示图像中尺度旋转不变性的特征。 a(x-u)(x-u) + 2b(x-u)(y-v) + c(y-v)(y-v) = 1#include Data Fieldsdouble xx 坐标double yy 坐标 double a仿射特性参数 Oxford-typedouble b仿射特性参数 Ox
8、ford-typedouble c仿射特性参数 Oxford-typedouble sclLowe-style 特征的大小 double oriLowe-style 特征的方向int d描述符号的数目 double descr FEATURE_MAX_D描述符号 128 个int type特征类型, OXFD 或 LOWE int category多用途特征种类struct feature * fwd_match前一副图片的配对特征 struct feature * bck_match后一副图片的配对特征struct feature * mdl_match模型中的配对特征CvPoint2D64
9、f img_pt图像中点的位置CvPoint2D64f mdl_pt模型中点的位置void * feature_data自定义数据 imgfeatures.h File Reference#include “cxcore.h“int import_features (char *filename, int type, struct feature *feat)从文件中读取特征数据 int export_features (char *filename, struct feature *feat, int n)导出 n 个特征数据到文件 void draw_features (IplImage
10、*img, struct feature *feat, int n)在图片上显示特征描述 double descr_dist_sq(struct feature * f1,struct feature * f2 ) 计算两个描述子的欧式距离。descr 128kdtree.h File Reference#include “cxcore.h“struct kd_node * kdtree_build (struct feature *features, int n) 构建 kd 树。 int kdtree_bbf_knn (struct kd_node *kd_root, struct fea
11、ture *feat, int k, struct feature *nbrs, int max_nn_chks) 使用 Best Bin First 搜索算法最佳(k 近邻)匹配的特征向量,返回特征数组。int kdtree_bbf_spatial_knn (struct kd_node *kd_root, struct feature *feat, int k, struct feature *nbrs, int max_nn_chks, CvRect rect, int model) 使用 Best Bin First 搜索算法最佳(指定空间范围的 k 近邻)匹配的特征向量, 返回特征数组。void kdtree_release (struct kd_node *kd_root) 释放 kd tree 内存空间。实验表明 BBF 算法性能很好,因为我们仅考虑 Ratio(最近邻距离/次最近邻距离) 0.49 的情形,所以不必花费大量时间在很多相似的距离中寻找最近邻上面。借助 透视变换