使用 mexopencv 提取 BRIEF 特征
Extract BRIEF features with mexopencv
我正在尝试使用 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);
我收到以下错误:
Warning: The following error was caught while executing 'cv.DescriptorExtractor' class destructor:
MxArray is not a scalar
In extract_train_orb (line 5)
Error using DescriptorExtractor_
Unrecognized extractor BRIEF
Error in cv.DescriptorExtractor (line 63)
this.id = DescriptorExtractor_(0, 'new', extractorType, varargin{:});
Error in extract_train_orb (line 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: In function ``mexFunction':
BriefDescriptorExtractor_.cpp:(.text+0x31d8): undefined reference to `createBriefDescriptorExtractor(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >)'
collect2: error: ld returned 1 exit status
这可能与特征检测器和描述符提取器之间的不兼容有关。例如,您可以尝试对检测器和提取器都使用 'SURF' 吗?
即使我的建议可行,我也希望 'ORB' 检测器可以与 'BRIEF' 提取器一起使用,因为 'ORB' 只是 'Oriented BRIEF'。但是,您应该确定检测器和特征提取器的兼容性,也许您应该阅读有关这些技术的论文。例如,除了关键点之外,一些提取器还会生成音阶或八度音阶,而有些则不会。类似地,一些描述符期望具有带有关键点的音阶或八度输入,而有些则没有。
这是一个原始的例子;您不能使用三星充电器为 iPhone 充电,反之亦然。都是手机都有充电器,但是不匹配
感谢@Miki 的建议,我解决了这个问题。
首先,应该安装contrib模块。我重新安装了 OpenCV 3.0,如 this guide 所示。然后,我 运行 make clean
、make
和 make contrib
在 mexopencv 目录上。
最后不得不用
extractor = cv.DescriptorExtractor('BriefDescriptorExtractor');
而不是
extractor = cv.DescriptorExtractor('BRIEF');
我正在尝试使用 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);
我收到以下错误:
Warning: The following error was caught while executing 'cv.DescriptorExtractor' class destructor: MxArray is not a scalar
In extract_train_orb (line 5) Error using DescriptorExtractor_ Unrecognized extractor BRIEF
Error in cv.DescriptorExtractor (line 63) this.id = DescriptorExtractor_(0, 'new', extractorType, varargin{:});
Error in extract_train_orb (line 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: In function ``mexFunction': BriefDescriptorExtractor_.cpp:(.text+0x31d8): undefined reference to `createBriefDescriptorExtractor(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >)' collect2: error: ld returned 1 exit status
这可能与特征检测器和描述符提取器之间的不兼容有关。例如,您可以尝试对检测器和提取器都使用 'SURF' 吗?
即使我的建议可行,我也希望 'ORB' 检测器可以与 'BRIEF' 提取器一起使用,因为 'ORB' 只是 'Oriented BRIEF'。但是,您应该确定检测器和特征提取器的兼容性,也许您应该阅读有关这些技术的论文。例如,除了关键点之外,一些提取器还会生成音阶或八度音阶,而有些则不会。类似地,一些描述符期望具有带有关键点的音阶或八度输入,而有些则没有。
这是一个原始的例子;您不能使用三星充电器为 iPhone 充电,反之亦然。都是手机都有充电器,但是不匹配
感谢@Miki 的建议,我解决了这个问题。
首先,应该安装contrib模块。我重新安装了 OpenCV 3.0,如 this guide 所示。然后,我 运行
make clean
、make
和make contrib
在 mexopencv 目录上。最后不得不用
extractor = cv.DescriptorExtractor('BriefDescriptorExtractor');
而不是
extractor = cv.DescriptorExtractor('BRIEF');