1

尝试编译特征检测算法时,出现以下编译错误:我正在编译/使用 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);
}
4

2 回答 2

1

您链接到的教程是在将 features2d 库分离为免费(非专利、开放许可)算法和未公开许可的东西之前编写的。SURF 和 SIFT 就是两种这样的算法。要访问 SurfFeatureDescriptor,您需要做的就是包含非自由包含文件夹中的 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);

你有它。希望这对您有用还为时不晚。

于 2012-07-27T17:38:53.310 回答
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 ;)

于 2012-05-29T23:09:08.857 回答