Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB和OpenCV之间不同的SURF特征提取?_Matlab_Opencv_Computer Vision_Surf_Matlab Cvst - Fatal编程技术网

MATLAB和OpenCV之间不同的SURF特征提取?

MATLAB和OpenCV之间不同的SURF特征提取?,matlab,opencv,computer-vision,surf,matlab-cvst,Matlab,Opencv,Computer Vision,Surf,Matlab Cvst,我正在用OpenCV实现一个算法,这是我在MATLAB中设计的。我正在为OpenCV中的SURF特性提取器编写一个单元测试,我想比较MATLAB提取的SURF特性与OpenCV的输出 这个问题是,对MATLAB和OpenCV提取器使用相同的参数,我得到了不同数量的特性。这怎么可能?是否有不同的方法来实现SURF 对于MATLAB(),我使用: MetricThresh:200 NumOctaves:3 NumscaleLevel:4 SURFSize:64 对于我正在使用的OpenCV: Hes

我正在用OpenCV实现一个算法,这是我在MATLAB中设计的。我正在为OpenCV中的SURF特性提取器编写一个单元测试,我想比较MATLAB提取的SURF特性与OpenCV的输出

这个问题是,对MATLAB和OpenCV提取器使用相同的参数,我得到了不同数量的特性。这怎么可能?是否有不同的方法来实现SURF

对于MATLAB(),我使用:

MetricThresh:200
NumOctaves:3
NumscaleLevel:4
SURFSize:64

对于我正在使用的OpenCV:

HessianThreshold:200
nOctaves:3
nOctaveLayers:4
扩展:false
直立:正确

这是怎么回事?有没有更好的方法来测试openCV和MATLAB是否从相同的图像中生成相同的提取的SURF特征


谢谢你的帮助

在引擎盖下,MATLAB使用OpenCV实现一些功能,包括检测特征。如果查看
$matlabroot/bin/$arch
文件夹,除了网关库
ocv.dll
)之外,还可以找到OpenCV共享库

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

MATLAB 赫伯特湾、安德烈亚斯·艾斯、蒂恩·图伊特拉尔斯、吕克·范古尔“冲浪: 加速“鲁棒特征”,计算机视觉和图像理解 (CVIU),第110卷,第3期,第346-359页,2008年

OpenCV Bay,H.和Tuytelaars,T.和Van Gool,L.“冲浪:加速的健壮功能”,第9届>欧洲计算机视觉会议,2006年


首先,考虑到默认值,确保在这两种情况下使用相同的参数值。以下是供参考的文档页面

因此,请尝试以下代码:

在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);
cv::Mat img;//一些灰度图像
cv::冲浪冲浪(200.0,3,4-2,假,真);
cv::Mat mask;//可选掩码(此处未使用)
std::向量pts;
surf(img、面罩、pts);

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

fyi您可能会认为此项目有用:(将OpenCV公开为MATLAB中的MEX函数)请注意,我从
numcalelevels
中减去了2,得到了
nOctaveLayers
(检查
edit detectsurfeatures.m
的源代码以了解)您好,感谢您的详细回答!我用这些参数尝试了你的方法,从相同的灰度图像中,OpenCV检测到254个点,而MATLAB检测到267个点。我使用的是Matlab2012a,我使用的OpenCV版本是v2.4.5。我想下一个合乎逻辑的步骤是重复这个测试,但是使用MATLAB使用v2.4.5库。如果你有任何其他建议,我将不胜感激。谢谢您的时间和帮助。@trianta2:就像我说的,如果您想获得完全相同的结果,您必须在两种情况下使用相同的OpenCV版本(这可能是不可能的)。据我所知,MatlabR2012a附带了OpenCV DLL v2.1.0(到目前为止被认为非常旧)。看到那些是硬编码的(你不能真正改变Matlab链接的),你唯一的选择就是这个旧版本,并建立你的C++程序来对付它…否则,我建议您忽略这些细微差异,坚持使用最新版本:)