2012-04-13 489 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); 

而且你有它。希望這對你沒有太大用處。