使用 mexopencv 提取简要特征
Posted
技术标签:
【中文标题】使用 mexopencv 提取简要特征【英文标题】:Extract BRIEF features with mexopencv 【发布时间】:2015-10-15 08:57:32 【问题描述】:我正在尝试使用 mexopencv 在 Matlab 中提取二进制特征。如果我使用 ORB 作为检测器和提取器,一切正常。问题是当我尝试使用简要提取器时。这是我正在使用的代码:
detector = cv.FeatureDetector('ORB');
extractor = cv.DescriptorExtractor('BRIEF'); % if I use 'ORB' here everything works fine
img = read('my-image');
keyPoints = detector.detect(img);
descriptors = extractor.compute(img, keyPoints);
我收到以下错误:
警告:执行“cv.DescriptorExtractor”类析构函数时发现以下错误: MxArray 不是标量
在 extract_train_orb 中(第 5 行) 使用 DescriptorExtractor_ 时出错 无法识别的提取器简介
cv.DescriptorExtractor 中的错误(第 63 行) this.id = DescriptorExtractor_(0, 'new', extractorType, varargin:);
extract_train_orb 中的错误(第 2 行) extractor = cv.DescriptorExtractor('BRIEF');
我不知道如何解决这个问题,因为 mexopencv's documentation 说 BRIEF 是受支持的提取器。
有人知道吗?谢谢
编辑:
事实上,ORB 是目前唯一有效的类型。 'BRIEF'、'SURF' 和 'SIFT' 类型出现相同的错误。
我在 Ubuntu 14.04 下使用 OpenCV 3.0 和 Matlab R2015b。
编辑 2:
contrib module
未安装。
我下载opencv_contrib,重新构建并重新安装 OpenCV,最后尝试编译 mexopencv contrib 模块:
make MATLABDIR=/usr/local/MATLAB/R2015b contrib
编译失败并出现以下错误:
/tmp/mex_619067277620954_21116/BriefDescriptorExtractor_.o:在函数“mexFunction”中: BriefDescriptorExtractor_.cpp:(.text+0x31d8): undefined reference to `createBriefDescriptorExtractor(__gnu_cxx::__normal_iterator >>, __gnu_cxx::__normal_iterator >>)' collect2:错误:ld 返回 1 个退出状态
【问题讨论】:
你能试试'BriefDescriptorExtractor'
吗?如果您使用的是 OpenCV 3.0,您可能还需要来自 contrib 模块的xfeatures2d
感谢@Miki,但输入“BriefDescriptorExtractor”也不起作用。
查看第 672 行 here。它应该像我提到的那样工作......你能仔细检查一下吗?
@Miki 正如您所说,我认为问题出在 contrib 模块中。我意识到它没有安装,所以我下载了 OpenCV 的代码,重新构建并重新安装 OpenCV,最后尝试编译 mexopencv contrib 模块。但是 contrib 模块的编译无论如何都会崩溃。
最后,我通过使用 contrib 模块重建 OpenCV 并清理并重建 mexopencv 来解决它。另外,我必须将类型写为“BriefDescriptorExtractor”,因为“BRIEF”不起作用。所以,如果你把这个放在答案中,我会接受@Miki
【参考方案1】:
这可能与特征检测器和描述符提取器之间的不兼容有关。例如,您可以尝试对检测器和提取器使用“SURF”吗?
即使我的建议有效,我也希望“ORB”检测器可以与“BRIEF”提取器一起使用,因为“ORB”只是“Oriented Brief”。但是,您应该确定检测器和特征提取器的兼容性,也许您应该阅读有关这些技术的论文。例如,除了关键点之外,一些提取器还会产生音阶或八度音阶,而有些则不会。类似地,一些描述符期望具有带有关键点的比例或八度音阶输入,而有些则没有。
这是一个原始示例;您无法使用三星充电器为 iPhone 充电,反之亦然。两者都是手机,都有充电器,但不匹配。
【讨论】:
感谢@guneykayim,但探测器/提取器之间的不兼容不是问题。 SURF 和 SIFT 在任何情况下都不起作用(cv.FeatureDetector('SURF')
产生类似的错误),BRIEF 绝对应该与 ORB 一起使用。
@user1805638 您是否按照@Miki 的建议添加了xfeatures2d
?【参考方案2】:
感谢@Miki 的建议,我解决了这个问题。
首先,应该安装 contrib 模块。我在this guide 中重新安装了 OpenCV 3.0。然后,我在 mexopencv 目录上运行 make clean
、make
和 make contrib
。
最后,我不得不使用
extractor = cv.DescriptorExtractor('BriefDescriptorExtractor');
而不是
extractor = cv.DescriptorExtractor('BRIEF');
【讨论】:
以上是关于使用 mexopencv 提取简要特征的主要内容,如果未能解决你的问题,请参考以下文章