OpenCV2 特征检测与匹配

本文介绍了OpenCV2中的特征检测算子,如SIFT、SURF和ORB。SIFT具有尺度和旋转不变性,但计算速度较慢,而ORB速度快但不具备尺度和旋转不变性。SURF作为SIFT的优化版,速度更快。文章通过代码示例展示了如何使用这些算子进行特征检测和匹配,并探讨了匹配比率阈值的选择。ORB通过FAST算法快速检测兴趣点,适用于速度敏感的应用。特征检测和匹配是两个独立步骤,可以自由组合不同的检测器和描述子提取器,如FAST+ORB的组合。
摘要由CSDN通过智能技术生成

由于OpenCV3 中的众多特征检测算子(如SIFT SURF ORB)所依赖的稳定版代码都已经从官方的版本中转移到xfeatures2d的第三方库中。所以我重新安装了OpenCV2.4.9版本。

特征检测算子,可以用来检测两幅图的稳定特征,来完成配准,也可以来进行三维重建,图像拼接的任务。

具有尺度旋转不变的特征检测算子SIFT,检测的特征很稳定,具有尺度不变性,旋转不变性,且精度较高。但是计算速度不快,因此有了SURF算子(为SIFT的3倍,精度有牺牲),还有ORB算子,速度非常快SIFT100背SURF的10倍,但是特征不具有尺度和旋转不变性(速度快所有三维重建用的多)。

SURF特征检测算子:
代码如下:

#include "highgui/highgui.hpp"    
#include "opencv2/nonfree/nonfree.hpp"    
#include "opencv2/legacy/legacy.hpp"   
#include <iostream>  
using namespace cv;
using namespace std;
int main()
{
   
	Mat image01 = imread("4.jpg", 1);    //右图
	Mat image02 = imread("3.jpg", 1);    //左图
	namedWindow("p2", 0);
	namedWindow("p1", 0);
	imshow("p2", image01);
	imshow("p1", image02);
	//灰度图转换  
	Mat image1, image2;
	cvtColor(image01, image1, CV_RGB2GRAY);
	cvtColor(image02, image2, CV_RGB2GRAY);
	//提取特征点    
	SurfFeatureDetector surfDetector(800);  // 海塞矩阵阈值,在这里调整精度,值越大点越少,越精准 
	vector<KeyPoint> keyPoint1, keyPoint2;
	surfDetector.detect(image1, keyPoint1);//检测出特征点
	surfDetector.detect(image2, keyPoint2);//检测出特征点
	//特征点描述,为下边的特征点匹配做准备    
	SurfDescriptorExtractor SurfDescriptor;
	Mat imageDesc1, imageDesc2;
	SurfDescriptor.compute(image1, keyPoint1, imageDesc1);//计算特征点描述
	SurfDescriptor.compute(image2, keyPoint2, imageDesc2);//计算特征点描述
	//获得匹配特征点,并提取最优配对     
	FlannBasedMatcher matcher;
	vector<DMatch> matchePoints;
	matcher.match(imageDesc1, imageDesc2, matchePoints, Mat());
	cout << "total match points: " << matchePoints.size() << endl;
	Mat img_match;
	drawMatches(image01, keyPoint1, image02, keyPoint2, matchePoints, img_match);
	namedWindow("match", 0);
	imshow("match", img_match);
	imwrite("match.jpg", img_match);
	waitKey();
	return 0;
}

效果图如下:
surf01
surfmatch01

斜率大的直线应该是错误的匹配,匹配效果一般。为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,SIFT的作者Lowe提出了比较最近邻距离与次近邻距离的SIFT匹配方式:取一幅图像中的一个SIFT关键点,并找出其与另一幅图像中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离得到的比率ratio少于某个阈值T,则接受这一对匹配点。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。显然降低这个比例阈值T,SIFT匹配点数目会减少,但更加稳定,反之亦然。

Lowe推荐ratio的阈值为0.8,但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6 之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点,所以建议ratio的取值原则如下:
ratio=0. 4:对于准确度要求高的匹配;
ratio=0. 6:对于匹配点数目要求比较多的匹配;
ratio=0. 5:一般情况下。

#include "highgui/highgui.hpp"    
#include "opencv2/nonfree/nonfree.hpp"    
#include "opencv2/legacy/legacy.hpp"   
#include <iostream>  
using namespace cv;
using namespace std;
int main()
{
   
	Mat image01 = imread("4.jpg", 1);
	Mat image02 = imread("3.jpg", 1);
	imshow("p2", image01);
	imshow("p1", image02);
	//灰度图转换 
	Mat image1, image2;
	cvtColor(image01, image1, CV_RGB2GRAY);
	
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值