【问题标题】:Different SURF Features Extracted Between MATLAB and OpenCV?在 MATLAB 和 OpenCV 之间提取不同的 SURF 特征?
【发布时间】:2013-07-25 18:58:12
【问题描述】:

我在 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
冲浪尺寸:64

对于我正在使用的 OpenCV:

HessianThreshold:200
nOctaves: 3
nOctaveLayers:4
扩展:假
直立:真

这里发生了什么?有没有更好的方法来测试 openCV 和 MATLAB 是否从同一张图像中提取了相同的 SURF 特征?

感谢您的帮助!

【问题讨论】:

标签: matlab opencv computer-vision surf matlab-cvst


【解决方案1】:

在底层,MATLAB 将 OpenCV 用于其一些 computer vision 函数,包括检测 SURF 特征。如果您查看 $matlabroot/bin/$arch 文件夹,您会发现 OpenCV 共享库以及网关库 ocv.dll)。

其实两者的文档中都提到了相同的参考论文,这表明算法参数在两个框架中具有相同的含义。

MATLAB

Herbert Bay、Andreas Ess、Tinne Tuytelaars、Luc Van Gool “冲浪: 加速鲁棒特征”,计算机视觉和图像理解 (CVIU), 卷。 110, No. 3, pp. 346--359, 2008

OpenCV

Bay, H. 和 Tuytelaars, T. 和 Van Gool, L. “SURF: Speeded Up Robust Features”,第 9 届 > 欧洲计算机视觉会议,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 DLL),这可能会导致与您使用的任何 OpenCV 版本不同的结果(目前最新的是 v2.4.6)

【讨论】:

  • 请注意,我将NumScaleLevels减去2得到nOctaveLayers(查看edit detectSURFFeatures.m的源代码即可理解)
  • 您好,感谢您的详尽回答!我用这些参数尝试了你的方法,并且从相同的灰度图像 OpenCV 检测到 254 个点,而 MATLAB 检测到 267 个点。我使用的是 MATLAB 2012a,我使用的 OpenCV 版本是 v2.4.5。我想下一个合乎逻辑的步骤是重复这个测试,但使用 MATLAB 使用 v2.4.5 库。如果您有任何其他建议,我将不胜感激。感谢您的时间和帮助。
  • @trianta2:就像我说的,如果你想获得完全相同的结果,你必须在两种情况下使用相同的 OpenCV 版本(这可能是不可能的)。据我所知,MATLAB R2012a 附带 OpenCV DLLs v2.1.0(现在认为已经很老了)。看到那些是硬编码的(你不能真正改变 MATLAB 所链接的内容),你唯一的选择是download 这个旧版本并针对它构建你的 C++ 程序......否则我建议你忽略这些微小的差异并坚持使用最新版本:)
猜你喜欢
  • 2011-07-29
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2023-03-21
  • 2011-09-04
  • 1970-01-01
相关资源
最近更新 更多