MATLAB和OpenCV提取的SURF特征有何不同?

4
我正在OpenCV中实现一个在MATLAB中设计的算法。我正在为OpenCV中的SURF特征提取器编写单元测试,并希望将MATLAB提取的SURF特征的输出与OpenCV进行比较。
问题是,使用相同的参数进行MATLAB和OpenCV提取器时,我得到了不同数量的特征。这怎么可能?有不同的实现SURF的方法吗?
对于MATLAB(http://www.mathworks.com/help/vision/ref/detectsurffeatures.html),我使用:MetricThresh: 200,NumOctaves: 3,NumScaleLevels: 4,SURFSize: 64。
对于OpenCV,我使用:HessianThreshold: 200,nOctaves: 3,nOctaveLayers: 4,extended: false,upright: true。
这里发生了什么?有没有更好的方法来测试openCV和MATLAB是否从同一图像中产生相同的提取SURF特征?
谢谢你的帮助!

2
你可能会发现这个项目很有用:https://github.com/kyamagu/mexopencv/ (将OpenCV作为MATLAB中的MEX函数公开) - Amro
1个回答

4
在MATLAB中,底层使用OpenCV实现计算机视觉函数,包括检测SURF特征。如果你查看$matlabroot/bin/$arch文件夹,你会发现除了一个网关库ocv.dll之外,还有OpenCV共享库。

事实上,同一份参考文献被提及在两个文档中,这表明算法参数在两个框架中具有相同的含义。

MATLAB

Herbert Bay, Andreas Ess, Tinne Tuytelaars, Luc Van Gool "SURF: Speeded Up Robust Features", Computer Vision and Image Understanding (CVIU), Vol. 110, No. 3, pp. 346--359, 2008

OpenCV

Bay, H. and Tuytelaars, T. and Van Gool, L. "SURF: Speeded Up Robust Features", 9th > European Conference on Computer Vision, 2006


首先,请确保在两个环境中使用相同的参数值,考虑默认值。以下是 OpenCVMATLAB 的文档页面供参考。
因此,请尝试以下代码:
在 MATLAB 中:
>> img = [];     % some 2d grayscale image
>> pts = detectSURFFeatures(img, 'MetricThreshold',200, ...
       'NumOctaves',3, 'NumScaleLevels',4);

在C++中的OpenCV:
cv::Mat img;     // some grayscale image
cv::SURF surf(200.0, 3, 4-2, false, true);

cv::Mat mask;    // optional mask (unused here)
std::vector<cv::KeyPoint> pts;
surf(img, mask, pts);

除此之外,MATLAB通常包含一个较旧的OpenCV版本(我的MATLAB R2013a附带v2.4.2 DLLs),这可能导致与您使用的任何OpenCV版本(目前最新版本为v2.4.6)不同的结果。

2
请注意,我从NumScaleLevels中减去了2,以获取nOctaveLayers(请检查edit detectSURFFeatures.m的源代码以理解)。 - Amro
你好,感谢您详尽的回答!我使用了您提供的参数并从同一灰度图像中运行了OpenCV和MATLAB,结果OpenCV检测到了254个点,而MATLAB检测到了267个点。我正在使用MATLAB 2012a,并且我使用的OpenCV版本是v2.4.5。我认为下一步应该是重复这个测试,但是要使用MATLAB使用v2.4.5库。如果您有其他建议,我将不胜感激。感谢您的时间和帮助。 - trianta2
2
@trianta2:就像我说的,如果你想获得完全相同的结果,你必须在两种情况下使用相同的OpenCV版本(这可能不可能)。从我所知道的情况来看,MATLAB R2012a附带了OpenCV DLLs v2.1.0(现在被认为是相当古老的版本)。由于这些是硬编码的(你不能真正改变MATLAB链接的内容),你唯一的选择是下载这个旧版本并构建你的C++程序...否则,我建议你忽略这些微小的差异,坚持使用最新版本 :) - Amro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接