opencv之特征检测与匹配(三)

1)SURF特征检测
SURF—-加速稳健特征算法 SURF是尺度不变特征变换SIFT的加速版,一般来说,标准的SURF算子比SIFT算子快好几倍,并且在多幅图像中具有更好的稳定性,SURF最大的特征在于采用harr特征以及积分图像的概念,这大大加快了程序运行时间,可以应用于物体识别以及三维重建中
在检测特征点的过程中计算了Hessian矩阵的行列式,与此同时,计算到了Hessian矩阵的迹,矩阵的迹分为对角元素之和
按照亮度的不同,可以将特征点分为两种,第一种为特征点及其周围小邻域的亮度比背景区域要亮.Hessian矩阵的迹为正,另外一种为特征点及其周围小邻域的亮度比背景区域要暗,hessian 矩阵为负值,根据这个特征,首先对两个特征点的hessian的迹进行比较,如果同号,说明两个特征点具有相同的对比度,如果异号,说明两个特征点的对比度不同,放弃特征点之间后续的相似性度量
对于两个特征点描述子的相似性度量,我们采用欧式距离进行计算,简单来说SURF算法采用了很多方法来对每一步进行优化而提高速度,SURF善于处理具有模糊和旋转的图像,但是不善于处理视角变化和光照变化
2)Opencv中的SURF算法接口
构造函数
explicit CV_WRAP SURF(double hessianThreshold int nOctaves=4,int nOctaveLayers=2,bool extended=true,bool upright=false);
&&hessianThreshold:Hessian矩阵行列式响应值的阈值
&&nOctaves:图像堆的组数
&&nOctaveLayers :图像堆中每组中的中间层数,改值加2等于每组图像中所包含的层数
&&extended:表示是128维描述符,还是64维描述符,为true时,表示128维描述符
&&upright:表示是否采用U-SURF算法,为true时,采用U-SURF算法
重载操作符
void operator()(InputArray img,InputArray mask,CV_OUT vector&keypoints)const;
void operator()(InputArray img,InputArray mask,CV_OUT vector&keypoints,OutputArray descriptors,bool useProvidedKeypoints=false)const;
3)特征点匹配方法
BruteForce匹配和FLANN匹配是Opencv二维特征点匹配常见的两种方法,分别对应BFMatcher和FLannBasedMatcher
二者的区别:
BFMatcher总是尝试所有可能的匹配,从而使得它总能找到最佳匹配
FLannBasedMatcher中FLANN是一种近似法 ,算法更快但是找到的是最近邻近似匹配,当我们需要找到一个相对好的匹配但是不需要最佳匹配的时候用这个,当然 也可以通过调整参数来提高匹配的精度或者提高算法的速度,但是相应的算法速度或者算法精度会受到影响

#include<opencv2/opencv.hpp>
#include<opencv2/nofree.hpp>

mMat srcImg1=imread("00.jpg");
Mat  srcImg2=imread("01.jpg);
//定义SURF特征检测类对象
SurfFeatureDetctor surfDetector(400);//hessian
//定义KeyPoint变量
vector<keyPoint>keyPoints1;
vector<KeyPoint>keyPoints2;
surfDector.detect(srcImg1,keyPoints1);
syrfDector.detect(srcImg2,keyPoints2);
//绘制特征点(关键点)
Mat feature_pic1,feature_pic2;
drawKeypoints(srcImg1,keyPoints1,feature_pic1,Scalar(0,0,255));
drawKeypoints(srcImg2,keyPoints2,feature_pic2,Scalar(0,0,255));
//drawKeypoints(srcImg1,keyPoints1,feature_pic1,Scalar(0,255,0),DrawMatchFlags::DRAW_RICH_KEYPOINTS);
//显示原图
imshow("src1",srcImg1);
imshow("src2",srcImg2);

//显示结果
imshow("result",)
#include<opencv2/legacy/legacy.hpp>
//计算特征点描述符/特征向量提取
SurfDescriptorExtractor  descriptor;
Mat description2;
descriptor.compute(srcImg2,keyPoints2,description2);
cout<<description1.cols<<end;
cout<<description1.rows<<endl;
//进行匹配
FlannBasedMatcher  matcher;//实例化FlANN匹配器
vector<DMatch>matches;//定义匹配结果变量
matcher.match(description1,description2,matches);//实现描述符之间的匹配

猜你喜欢

转载自blog.csdn.net/xujaiwei/article/details/75005394