我正在 OpenCV 中实现我在 MATLAB 中设计的算法。我正在为 OpenCV 中的 SURF 特征提取器编写单元测试,我想将 MATLAB 提取的 SURF 特征的输出与 OpenCV 进行比较。
这个问题是,对 MATLAB 和 OpenCV 提取器使用相同的参数,我得到了不同数量的特征。这怎么可能?是否有不同的方式来实现 SURF?
对于 MATLAB ( http://www.mathworks.com/help/vision/ref/detectsurffeatures.html ) 我正在使用:
指标阈值:200
Octave 数:3
NumScaleLevels:4
表面尺寸:64
对于 OpenCV,我使用的是:
黑森阈值:200
n Octave :3
nOctaveLayers:4
扩展:假
直立:正确
这是怎么回事?是否有更好的方法来测试 openCV 和 MATLAB 是否从同一图像生成相同的提取 SURF 特征?
感谢您的帮助!
最佳答案
在幕后,MATLAB 将 OpenCV 用于它的一些 computer vision功能,包括检测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
首先,确保您在两者中使用相同的参数值,同时考虑默认值。这是 OpenCV 的文档页面和 MATLAB供引用。
所以试试下面的代码:
在 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 DLL),这可能会导致与您使用的任何 OpenCV 版本不同的结果(目前最新版本是 v2.4.6)
关于matlab - 在 MATLAB 和 OpenCV 之间提取不同的 SURF 特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865546/