OpenCV SurfDescriptorExtractor编译错误

问题描述 投票:1回答:2

在尝试编译特征检测算法时,我得到以下编译错误:我正在使用clang编译/链接,而我的OpenCV版本是2.3.1版本。我正在(大致)关注本教程以获得功能匹配:http://opencv.itseez.com/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html

error: use of undeclared identifier 'SurfDescriptorExtractor';
      did you mean 'OrbDescriptorExtractor'?
SurfDescriptorExtractor extractor;
^

有趣的是,Brief和Orb描述符提取器工作“很好”(我最终得到运行时错误)。

这是相关代码:

void setup_and_draw_keypoints(Mat& img, Mat& prev)
{
  // Detect Keypoints
  vector<KeyPoint> keypoints, prev_keypoints;
  GoodFeaturesToTrackDetector gftt;
  gftt.detect(img, keypoints);
  gftt.detect(prev, prev_keypoints);

  //Extract Descriptors
  SurfDescriptorExtractor extractor;
  Mat desc_1, desc_2; // Descriptors
  extractor.compute(img, keypoints, desc_1);
  extractor.compute(prev, prev_keypoints, desc_2);
  FlannBasedMatcher matcher;
  vector<DMatch> matches;

  matcher.match(desc_1, desc_2, matches);
}
c++ opencv compilation
2个回答
0
投票

某些内容存在于您的库的文档中并不一定意味着它位于库的.so和标题中;)

Open CV有多个模块,其中一个是flann,可能只在安装了flann时才编译,你甚至可能需要明确要求它。当你在opencv的源tar.gz下载上运行cmake或cmake-gui时,你可以选择要编译的模块。

也许你没有从源代码编译opencv,在这种情况下你的linux系统软件包维护者做了,可能没有包含它。

这是你可能会发现的:

[herbert@Durk ~]$ ls /usr/lib/libopencv_*.so
/usr/lib/libopencv_calib3d.so  /usr/lib/libopencv_features2d.so      /usr/lib/libopencv_highgui.so  /usr/lib/libopencv_ml.so         /usr/lib/libopencv_photo.so          /usr/lib/libopencv_video.so
/usr/lib/libopencv_contrib.so  /usr/lib/libopencv_flann.so           /usr/lib/libopencv_imgproc.so  /usr/lib/libopencv_nonfree.so        /usr/lib/libopencv_stitching.so  /usr/lib/libopencv_videostab.so
/usr/lib/libopencv_core.so     /usr/lib/libopencv_gpu.so             /usr/lib/libopencv_legacy.so   /usr/lib/libopencv_objdetect.so  /usr/lib/libopencv_ts.so
[herbert@Durk ~]$ ls /usr/include/opencv2/
calib3d  contrib  core  features2d  flann  gpu  highgui  imgproc  legacy  ml  nonfree      objdetect  opencv.hpp  opencv_modules.hpp  photo  stitching  ts  video  videostab
[herbert@Durk ~]$ 

正如你所看到的,我很幸运能安装了flann;)


1
投票

您链接到的教程是在将features2d库分离为免费(非专利,开放许可)算法之前编写的,以及未公开许可的内容。 SURF和SIFT是两种这样的算法。要访问SurfFeatureDescriptor,您需要做的就是包含来自nonfree includes文件夹的features2d.hpp标头。

在我的opencv发行版(我目前正在使用2.4.1)中,它位于:“C:\ Users \ Jake \ Downloads \ opencv \ modules \ nonfree \ include \ opencv2 \ nonfree \ features2d.hpp”。我在项目设置中将路径“C:\ Users \ Jake \ Downloads \ opencv \ modules \ nonfree \ include \”列为包含目录,因此在我的代码中,我所做的只是:

#include <opencv2/nonfree/features2d.hpp>

SiftDescriptorExtractor siftExtractor;
//Later on in the file, after a frame has been grabbed, keypoints found, etc.
Mat siftDescriptors;
siftExtractor.compute(frame,roiKP,siftDescriptors);

你有它。希望这对您来说还不算太晚。

© www.soinside.com 2019 - 2024. All rights reserved.