使用 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 cleanmakemake contrib

    最后,我不得不使用

    extractor = cv.DescriptorExtractor('BriefDescriptorExtractor');

    而不是

    extractor = cv.DescriptorExtractor('BRIEF');

【讨论】:

以上是关于使用 mexopencv 提取简要特征的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 提取 HoG 特征

matlab opencv 特征点提取与匹配问题

OpenCV实战——使用MSER提取特征区域

尝试在 opencv 4.5.1 中使用 SIFT 提取特征时出现问题

OpenCV-Python之——图像SIFT特征提取

请问大虾们,opencv如何只对图像选择区域提取特征点