我正在尝试使用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退出状态
答案 0 :(得分:1)
它可能与特征检测器和描述符提取器之间的不兼容性有关。例如,您可以尝试将“SURF”用于探测器和提取器吗?
即使我的建议有效,我也希望'ORB'探测器与'BRIEF'提取器配合使用,因为'ORB'只是'Oriented Brief'。但是你应该确定探测器和特征提取器的兼容性,也许你应该阅读有关这些技术的论文。例如,除了关键点之外,一些提取器还产生缩放或八度音阶,而有些则没有。类似地,一些描述符期望具有关键点的缩放或八度输入,而一些描述符不期望。
这是一个原始的例子;你不能用三星充电器给iPhone充电,反之亦然。两款手机都配有充电器,但它们不匹配。
答案 1 :(得分:1)
由于@Miki的建议,我解决了这个问题。
首先,应安装contrib模块。我在this guide中重新安装了OpenCV 3.0。然后,我在mexopencv目录上运行make clean
,make
和make contrib
。
最后,我不得不使用
extractor = cv.DescriptorExtractor('BriefDescriptorExtractor');
而不是
extractor = cv.DescriptorExtractor('BRIEF');