2012-04-13 97 views
1

当试图编译特征检测算法时,我得到以下编译错误: 我正在编译/链接与铛,而我的OpenCV版本是2.3.1版本。我在下面(大致)本教程以获取特征匹配:http://opencv.itseez.com/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.htmlOpenCV SurfDescriptorExtractor编译错误

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

有趣的简介和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); 
} 

回答

0

的东西是你的库文件中并不一定意味着它是在。所以,你的库头的事实;)

开放CV有多个模块,其中一个是flann,可能只有在安装flann时才会编译,你甚至可能需要明确地询问它。当你运行cmake或cmake-gui时,你可以选择要编译的模块。

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

这是你会如何找出:

[[email protected] ~]$ 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 
[[email protected] ~]$ 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 
[[email protected] ~]$ 

正如你所看到的,我很幸运有安装FLANN;)

1

您链接到的分离之前写的教程features2d库转换为免费(非专利,开放许可证)算法,以及未公开许可的内容。 SURF和SIFT是两种这样的算法。要访问SurfFeatureDescriptor,您只需包含非自由包含文件夹中的features2d.hpp头文件。它位于:“C:\ Users \ Jake \ Downloads \ opencv \ modules \ nonfree \ include \ opencv2 \ nonfree \ features2d.hpp”在我的opencv发行版中(我正在使用2.4.1) 。我有路径为“C:\用户\杰克\下载\ OpenCV的\模块\非自由\包括\”作为一个包括目录在我的项目设置中列出的,所以在我的代码我要做的就是:

#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); 

而且你有它。希望这对你没有太大用处。