SIFT简介
Scale Invariant Feature Transform,尺度不变特征变换匹配算法,是由David G. Lowe在1999年(《Object Recognition from Local Scale-Invariant Features》)提出的高效区域检测算法,在2004年(《Distinctive Image Features from Scale-Invariant Keypoints》)得以完善。
SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是非常稳定的局部特征,现在应用很广泛。而SIFT算法是将Blob检测,特征矢量生成,特征匹配搜索等步骤结合在一起优化。
SIFT在opencv中的使用
SIFT sift1, sift2; //实例化SIFT
vector<KeyPoint> key_points1, key_points2; //关键点容器
Mat descriptors1, descriptors2, mascara;
然后,就可以用重载的方式使用SIFT来对图像进行特征点提取。
sift1(img1, mascara, key_points1, descriptors1);
sift2(img2, mascara, key_points2, descriptors2);
SIFT的介绍:
SIFT::SIFT(int nfeatures=0, int nOctaveLayers=3, double contrastThreshold=0.04, double edgeThreshold=
10, double sigma=1.6)
nfeatures:特征点数目nOctaveLayers:高斯金字塔的层数
contrastThreshoid:特征点提取的阈值,contrastThreshoid的值越大,特征点的数目越少。
edgeThreshold:边缘提取的阈值
sigma:金字塔第0层图像滤波系数,就是σ
重载操作符
void SIFT::operator()(InputArray img, InputArray mask, vector<KeyPoint>& keypoints, OutputArray
descriptors, bool useProvidedKeypoints=false)
InputArray img:输入图像的矩阵
InputArray mask:图像检测区域
vector<Keypoint>&keypoints:特征向量矩阵
outputArray:输出图像
descriptors:特征点描述的输出向量
bool usePrividedKeypoints:是否进行特征点检测,ture 进行,false 不进行