opencv3.1 SURF特征点算法说明与示例
SURF (Speeded Up Robust Features)是一种具有鲁棒性的局部特征检测算法。CSDN的博主zhaocj写的Opencv2.4.9源码分析——SURF对SURF算法分析的非常透彻,建议想学习SURF算法原理的同学去研读。本文从应用角度来记录SURF算法,并给出相应的范例。
1. 使用SURF算法时涉及的参数说明
在opencv3.1中,SURF的实现文件在相应版本的opencv_contrib中,其路径为opencv_contrib\modules\xfeatures2d\src\surf.cpp。opencv_contrib的编译方法可以参考cmake-gui和vs2013编译opencv和opencv_contrib源码.
SURF 类的构造函数为:
explicit CV_WRAP SURF_Impl(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 算法。在一些应用中,旋转不变性并不是必须的,SURF算法作者把这种不需要确定特征点方向的方法称为 U-SURF算法。
SURF类实例化后,实例化的变量可以调用SURF类中的函数detectAndCompute来获取图像的特征点描述子。
void detectAndCompute(InputArray img, InputArray mask, CV_OUT std::vector<KeyPoint>& keypoints, OutputArray descriptors,bool useProvidedKeypoints = false);
detectAndCompute参数的含义为:
img 表示输入 8 位灰度图像
mask 为掩码矩阵,用于屏蔽源图像中的特定区域
keypoints 为特征点矢量数组
descriptors 为特征点描述符
useProvidedKeypoints 表示是否运行特征点的检测,该值为 true 表示不进行特征点的检测,而只是利用输入的特征点进行特征点描述符的运算。
2 SURF算法中的图像金字塔
要想实现特征点的尺度不变性,就需要在尽可能多的尺度图像上检测特征点。如何建立连续多幅的尺度图像,就成了不变性特征检测的关键。目前比较好的方法是建立尺度图像金字塔。在SURF 中,尺度图像的建立是依靠盒状滤波器模板,它采用了不改变输入图像的尺寸大小,而仅仅改变盒状滤波器模板大小的方式,即多幅尺度逐渐增加的尺度图像的尺寸大小完全一致,这里称之为图像组。
SURF算法的图像金字塔的图像组数由SURF构造函数中的参数nOctaves设定,每一组图像中的层数则由参数nOctaveLayers设定。下图中有两组不同的盒状滤波器尺寸,其中一组是SURF算法作者论文中用的滤波器尺寸,而另外一组则是opencv中SURF算法源码中所使用的滤波器尺寸,目前确认opencv2.4.9和opencv3.1中均使用的时该组滤波器尺寸。
下图的原图来源于SURF算法应用工业检测之二(算法原理分析),我对图片进行了一些注释和修改,在此感谢原作者。
3. SURF算法应用案例
本节应用案例的原型来自于opencv_contrib\modules\xfeatures2d\samples\surf_matcher.cpp,我对原文件进行了一点点改造,让该文件可以选择用SURF或SIFT算法来进行图像匹配。本节主要对比SURF算法设置不同的参数时的运行结果。
如下图所示,用来测试匹配效果的图片原图为同一张,其中一张是张昌正常角度,而另外一张则是旋转一定角度的。我修改了hessianThreshold,nOctaves,nOctaveLayers这三个参数用来对比匹配效果,基本实验结论:
3.1 hessianThreshold设置为100获得的特征点比设置为800获得的特征点多,我尝试过设置为50,但不会再有明显差异。这个现象与文献Opencv2.4.9源码分析——SURF 提及的“阈值越大,特征点越多”不符。
3.2 nOctaves增大两倍并不会对特征点有影响;
3.3 nOctaveLayers增大两倍会有更多的特征点,计算时间会增加。
4. 源代码
SURF特征点匹配和SIFT特征匹配的源代码我已上传至CSDN:SURF/SIFT特征点图像匹配示例
该源代码使用环境:VS2013,opencv3.1,且需要单独编译与该版本匹配的opencv_contrib。