利用SURF算法进行散斑图案拼接

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33810188/article/details/83350689

最近项目中需要将两个相机拍摄的散斑局部图拼接成一个完整的散斑图,特将实际项目中使用的特征点匹配和拼接算法记录如下,便于后续查阅。

----------------------------------------------------

基本概念

要对图像进行拼接,首先要进行图像特征匹配(找到图像的对应关系),而要进行图像特征匹配,首先要进行图像特征的检测,所以整个流程可以表示为:图像特征检测 ——> 图像特征匹配 ——> 图像拼接

目前特征检测主要有关键点检测、边缘检测、线检测、块检测等。由于散斑图中点特征较为明显,特以关键点作为图像特征检测对象。

主流的特征点检测算法有以下几类:

1.SIFT

Scale-Invariant Feature Transform尺度不变特征转化。该算法具备投影变换不变性(欧式变换不变性、尺度变换不变性...),且可以较好对抗噪声和遮挡影响,具有很高的特征点检测精度,但是算法实现较为繁琐,处理速度较慢。

2.SURF

Speed Up Robust Feature加速稳健特征。SURF是SIFT的升级版,主要是为了解决SIFT速度慢的缺点。

3.FAST

Feature from Accelerated Segment Test加速分割测试获取特征。该算法仅仅是特征点检测,不涉及特征描述,不具备欧式变换不变性和尺度变换不变性,但是该算法的检测速度超级快(名不虚传!)

4.ORB

Oriented BRIEF是FAST+BRIEF的组合体,结合了FAST检测和BRIEF特征描述子,具备较高的特征提取精度和效率!同时具备旋转不变性(BRIEF特点),且对噪声不敏感,但是任然不具备尺度变换不变性!

5.Harris

应用十分广泛的角点提取算法,通过图像梯度计算,根据卷积思想进行图像角点检测。

还有HOG、Haar、LBP等特征点检测算法。

----------------------------------------------------

源图像

----------------------------------------------------

匹配效果

结合散斑图特点,并考虑在线实时匹配要求,最开始考虑使用ORB进行散斑图的一系列处理,但是在实际的操作中发现其实现效果并不好(也许是算法本身欲速则不达,也许是本人参数设置不合理!),最后果断采用SURF算法,经过实际的散斑图案匹配测试,发现该算法实现效果明显,可以满足实际要求!

以下是用于匹配拼接的两幅散斑图(两个工业相机获取后并截取300*400区域):

利用SURF算法匹配后的效果图如下:

从匹配效果图中可以看出,图中的10对匹配点效果良好。需要说明的是,匹配点对数量较大,并且包含了大量误差匹配点对,为此从matchPoints中选取汉明距离最小的前10个值最为最终的匹配点对数据。后面进行散斑图案的拼接,可以利用这10个匹配点对计算拼接参数。通过不同的样本测试,这种方式的匹配效果非常稳定,可以进行后续的拼接。

----------------------------------------------------

拼接效果

拼接效果不错,看不出是两幅散斑图像拼接之后的结果(拼接的位置在中心暗区域靠右1/3处)。

需要说明的是,匹配采用中心区域的散斑图案(全图像进行匹配效率很低!),中心区域匹配成功之后,利用匹配点对建立左右散斑图的透视变换矩阵,之后校正右散斑图像,并将左散斑图像连接在校正后右图像的左边。

采用SURF算法进行2048*2448的两幅图像拼接,算法耗时控制在1s之内!整个拼接过程精度较高,效率也不错,后续对算法进行鲁邦性测试,以便满足实际的工程需求。

----------------------------------------------------

函数说明

SURF算法实现采用OpenCV库函数,主要如下:

特征点检测类:

cv::SurfFeatureDetector

特征点描述类:

cv::SurfDescriptorExtractor

特征点匹配:

cv::FlannBasedMatcher

最后在匹配点对集中挑选前10个匹配点对,并将其余的点对删除!

特征点匹配效果函数:

cv::drawMatches( )

透视变换函数:

cv::warPerspective( )

----------------------------------------------------

20181030增加:

针对优秀匹配点对仍然有匹配错误的情况,可以由以下方式避免:

1.对汉明距离进行严格管控;

2.对匹配点对连线斜率进行严格管控;

----------------------------------------------------

----------------------------------------------------

 

 

 

 

 

展开阅读全文

SURF算法进行特征点检测,运行时出错

12-04

今天参照@浅墨-毛星云的《opencv3.0编程入门》里的SURF特征点检测的程序如下在vs2013里运行了一下(用的opencv2.4.9),编译时出错,不知道什么原因,请高手看看rn程序:rn#include "opencv2/core/core.hpp" rn#include "opencv2/features2d/features2d.hpp"rn#include "opencv2/highgui/highgui.hpp"rn#include "opencv2/nonfree/nonfree.hpp"rn#includern#include rnrnusing namespace cv;rnusing namespace std;rnrnint main()rnrn rn //【1】载入源图片并显示rn Mat srcImage1 = imread("1.jpg", 1);rn Mat srcImage2 = imread("2.jpg", 1);rn if (!srcImage1.data || !srcImage2.data)//检测是否读取成功rn rn cout<<"读取图片错误,请确定目录下是否有imread函数指定名称的图片存在~! \n"; rn return false;rn rn imshow("原始图1", srcImage1);rn imshow("原始图2", srcImage2);rnrn //【2】定义需要用到的变量和类rn int minHessian = 400;//定义SURF中的hessian阈值特征点检测算子rn SurfFeatureDetector detector(minHessian);//定义一个SurfFeatureDetector(SURF) 特征检测类对象rn vector keypoints_1, keypoints_2;//vector模板类是能够存放任意类型的动态数组,能够增加和压缩数据rnrn //【3】调用detect函数检测出SURF特征关键点,保存在vector容器中rn detector.detect(srcImage1, keypoints_1);rn detector.detect(srcImage2, keypoints_2);rnrn //【4】绘制特征关键点rn Mat img_keypoints_1; Mat img_keypoints_2;rn drawKeypoints(srcImage1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);rn drawKeypoints(srcImage2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);rnrn //【5】显示效果图rn imshow("特征点检测效果图1", img_keypoints_1);rn imshow("特征点检测效果图2", img_keypoints_2);rnrn waitKey(0);rn return 0;rnrn编译时的错误如下:rn1>------ 已启动生成: 项目: opencv2版本, 配置: Debug Win32 ------rn1> 源.cpprn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(73): error C2061: 语法错误: 标识符“vector”rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(77): error C2061: 语法错误: 标识符“vector”rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(79): error C2535: “void cv::SIFT::operator ()(cv::InputArray,cv::InputArray) const”: 已经定义或声明成员函数rn1> d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(72) : 参见“cv::SIFT::operator ()”的声明rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(81): error C2143: 语法错误 : 缺少“;”(在“*”的前面)rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(81): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 intrn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(81): warning C4183: “info”: 缺少返回类型;假定为返回“int”的成员函数rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(83): error C2061: 语法错误: 标识符“vector”rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(84): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 intrn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(84): error C2143: 语法错误 : 缺少“,”(在“<”的前面)rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(85): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 intrn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(85): error C2143: 语法错误 : 缺少“,”(在“<”的前面)rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(89): error C2061: 语法错误: 标识符“vector”rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(90): error C2061: 语法错误: 标识符“vector”rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(125): error C2061: 语法错误: 标识符“vector”rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(128): error C2061: 语法错误: 标识符“vector”rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(130): error C2535: “void cv::SURF::operator ()(cv::InputArray,cv::InputArray) const”: 已经定义或声明成员函数rn1> d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(124) : 参见“cv::SURF::operator ()”的声明rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(132): error C2143: 语法错误 : 缺少“;”(在“*”的前面)rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(132): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 intrn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(132): warning C4183: “info”: 缺少返回类型;假定为返回“int”的成员函数rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(142): error C2061: 语法错误: 标识符“vector”rn1>d:\opencv-2.4.9\opencv\build\include\opencv2\nonfree\features2d.hpp(143): error C2061: 语法错误: 标识符“vector”rn[color=#FF0000][color=#FF0000]我最郁闷的是为何出现vector标识符这样的语法错误,不是std特征空间的问题[/color][/color] 论坛

没有更多推荐了,返回首页