使用mexopencv

时间:2015-10-15 08:57:33

标签: matlab opencv ubuntu-14.04 mex feature-extraction

我正在尝试使用mexopencv在Matlab中提取二进制特征。如果我使用ORB作为探测器和提取器一切正常。问题是当我尝试使用Brief提取器时。这是我正在使用的代码:

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):未定义的引用`createBriefDescriptorExtractor(__ gnu_cxx :: __ normal_iterator>>,__ gn_cxx :: __ normal_iterator>>)'   collect2:错误:ld返回1退出状态

2 个答案:

答案 0 :(得分:1)

它可能与特征检测器和描述符提取器之间的不兼容性有关。例如,您可以尝试将“SURF”用于探测器和提取器吗?

即使我的建议有效,我也希望'ORB'探测器与'BRIEF'提取器配合使用,因为'ORB'只是'Oriented Brief'。但是你应该确定探测器和特征提取器的兼容性,也许你应该阅读有关这些技术的论文。例如,除了关键点之外,一些提取器还产生缩放或八度音阶,而有些则没有。类似地,一些描述符期望具有关键点的缩放或八度输入,而一些描述符不期望。

这是一个原始的例子;你不能用三星充电器给iPhone充电,反之亦然。两款手机都配有充电器,但它们不匹配。

答案 1 :(得分:1)

由于@Miki的建议,我解决了这个问题。

  1. 首先,应安装contrib模块。我在this guide中重新安装了OpenCV 3.0。然后,我在mexopencv目录上运行make cleanmakemake contrib

  2. 最后,我不得不使用

    extractor = cv.DescriptorExtractor('BriefDescriptorExtractor');

    而不是

    extractor = cv.DescriptorExtractor('BRIEF');