特征点的检测与匹配,在物体识别,视觉追踪,三维重建领域都有很广泛的应用 ,Opencv 提供了如下几种特征检测方法

“FAST”—–FastFeaturedector 
 “STAR”—–StartFeaturedector 
 “SIFT”——SIFTF(nonfree module) 
 “SURF”—–SURF(nonfree module) 
 “ORB”—–ORB 
 “MSER”–MSER 
 “GFTI”—–GoodFeaturesToTrackDector 
 “HARRIS”—-配合Harrisdector 
 “Dense”——DenseFeatureDector 
 “SimpleBlob”—-SimpleBlobDector

对SIFT和SURF做简单介绍,需要说明的是在Opencv3版本中,许多著名的特征检测算子(如SIFT SURT ORB)稳定版的源代码都已经从官方发行的Opencv3中移除,而转移到一个名为xfeature的第三方库中,所以使用Opencv3要注意

1)SIFT特征检测
尺度不变特征变换 ,SIFT特征对旋转,尺度缩放,亮度变化等保持不变性,是非常稳定的局部特征,现在应用很广泛
Harris角点检测,特征具有旋转不变性,即使图像发生旋转,我们也能找到同样的角点,但是如果对图像进行缩放,角点就可能不是角点了,所以
资料讲解就不写了
这个算法受专利保护,这个算法包含在Opencv的收费模块
2)Opencv中的SIFT算法接口
构造函数
explicit SIFT(int nfeatures=0,int noOctveLayers=3,double contrastThreshold=0.04,double edgeThreshold=10,double sigma=1.6)
&&nfeatures:特征点数目(算法对检测出的特征点排名,返回最好的nfeatures个特征点)
&&nOctavelayers:金字塔中每组的层数
&&contrastThreshold:过滤掉较差的特征点的对比阈值,越大,返回的特征点就越少
&&edgeThreshold:过滤掉边缘效用的阈值,越大,特征点越多(被多滤掉的越少)
&&sigma:金字塔第零层图像的高斯滤波系数
重载操作符

void operator()(InputArray img,InputArray mask,vector&keypoints)const; 
 &&img:8位灰度图像 
 &&mask:需要检测图像的掩码(可选) 
 &&keypoints:检测到的特征点 
 &&descriptors:特征点描述的输出向量(如果不需要输出,需要传cv::noArray()) 
 &&useProvidedKeypoints: 
 KeyPoint类-特征点检测相关的数据结果,用来表示特征点 
 class KeyPoint 
 { 
 Point2f pt;//坐标 
 float size;//特征点邻域直径 
 float angle;//特征点的方向:值为(0,360)负值表示不使用 
 float response; 
 int octave;//特征点所在的图像金字塔的组 
 int class_id ;//用来聚类的id 
 }


绘制关键点 drawKeypoints(const Mat &image,const vector&Keypointd,CV_OUT Mat&outImage,const Scalar &color=Scalar::all(-1),int flags=DreawMatchesFlags::DEFAULT) 
 &&image:输入图像 
 &&Keypoints:根据原图像得到的特征点 
 &&outImage:输出图像,其内容取决于第五个参数标识符flags 
 &&color:所绘制关键点的颜色 
 &&flags:绘制关键点的特征标识符,默认值为DrawMatchsFlags::DEFAULT 其他 
 struct CV_EXPORTS DrawMatchesFlags 
 { 
 enum 
 { 
 DEFAUIT=0, 
 DRAW_OVER_OUTIMG=1 
 NOT_DRAW_SINGLE_POINTS=2 
 DRAW_RICH_KEYPOINTS=4};
};
#include <opncv2/nofree.nonfree.hpp>//要加这个
Mat srcImg1=imread("00.jpg");
Mat srcImg2=imread("01.jpg");
//定义SIFT特征类对象
SiftFeatureDector siftDector1;
siftFeatureDectoe siftDector2;;
//定义KeyPoint变量
vector<KeyPoint>keyPoints1;
vector<KeyPoint>KeyPoints2;
//特征点检测
siftDector1.detect(srcImg1,keyPoints1);
siftDector2.detect(srcImg2,keyPoints2);
//绘制特征点(关键点)
Mat feature_pic1,feature_pic2;
drawKeypoints(srcImg1,KeyPoints1,feature_pic1,Scalar(0,0,255));
drawKeypoints(srcImg1,keyPoints2,feature_pic2,Scalar(0,0,255));
//drawKeypoints(srcImg1,keyPoints1,feature_pic1,Scalar(0,255,0),DrawMatchesFlags::DRAW_TICH_KEYPOINTS);
imshow("src1",srcImg1);
imshow("src2",srcImg2);
//显示结果
imshow("feature1",feature_pic1);
imshow("feature2",feature_pic2);
waitKey(0);