我在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
延长:假
正直的:真的
这里发生了什么?有没有更好的方法来测试openCV和MATLAB是否从同一图像中生成相同的提取SURF特征?
感谢您的帮助!
答案 0 :(得分:4)
在幕后,MATLAB将OpenCV用于其computer vision部分功能,包括检测SURF功能。如果您查看$matlabroot/bin/$arch
文件夹,除了网关库ocv.dll
之外,您还可以找到OpenCV共享库。)
事实上,在两者的文档中都提到了相同的参考文件,这表明算法参数在两个框架中具有相同的含义。
Herbert Bay,Andreas Ess,Tinne Tuytelaars,Luc Van Gool“SURF: 加快强大功能“,计算机视觉和图像理解 (CVIU),Vol。 110,No。3,pp.346--359,2008
Bay,H。和Tuytelaars,T。和Van Gool,L。“SURF:Speeded Up Robust Features”,第9版>欧洲计算机视觉会议,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)