2015-04-17 116 views
4

我正在運行Ubuntu 14.04。我正嘗試使用openCV 3運行FLANN,但出現錯誤。OpenCV 3中的FLANN錯誤

通過使用AKAZE和ORB,但是如果從我嘗試使用ORB的代碼嘗試一切波紋管。

我使用ORB來查找描述符和關鍵點。

Ptr<ORB> detector = ORB::create(); 

    std::vector<KeyPoint> keypoints_1, keypoints_2; 
    Mat descriptors_1, descriptors_2; 

    detector->detectAndCompute(img_1, noArray(), keypoints_1, descriptors_1); 
    detector->detectAndCompute(img_2, noArray(), keypoints_2, descriptors_2); 

我用ORB後,我用下面的代碼來尋找匹配:

FlannBasedMatcher matcher; 
    std::vector<DMatch> matches; 
    matcher.match(descriptors_1, descriptors_2, matches); 

代碼建立罰款和一切。當我運行代碼時出現此錯誤:

OpenCV Error: Unsupported format or combination of formats (type=0 
) in buildIndex_, file /home/jim/opencv/modules/flann/src/miniflann.cpp, line 315 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /home/jim/opencv/modules/flann/src/miniflann.cpp:315: error: (-210) type=0 
in function buildIndex_ 

Aborted (core dumped) 

有人可以告訴我爲什麼嗎? OpenCV 3處於BETA狀態嗎?是否有FLANN替代(除BFMatcher)

+0

你能提供有關如何使描述符的更多信息?一些匹配器不接受float/int中的描述符 –

+0

@RafaFirenze剛剛添加了(我上面的帖子)我用來查找描述符的代碼。 –

+0

看到相同問題的答案[這裏](http://answers.opencv.org/question/59996/flann-error-in-opencv-3/) – berak

回答

7

所以我說:

爲了使用FlannBasedMatcher您需要將您的描述轉換爲CV_32F

if(descriptors_1.type()!=CV_32F) { 
    descriptors_1.convertTo(descriptors_1, CV_32F); 
} 

if(descriptors_2.type()!=CV_32F) { 
    descriptors_2.convertTo(descriptors_2, CV_32F); 
} 

你可以去看看this similar question

+0

它的工作!非常感謝你的幫助。我已經看過那篇文章(你鏈接到),但因爲接受的答案表示這只是一個錯誤,我忽略了它。再次感謝您的幫助:) –

+0

沒問題!我想當它發生在我身上時,我也是這樣做的! ;) –

+0

嗨,我也唱ORB和得到相同的錯誤。我試圖使用提供的解決方案,但我再次得到同樣的錯誤。你可以幫助解決。 – Anirudh

0

Unsupported format or combination of formats也會拋出,如果沒有描述符可以計算。

您可以檢查是否是detectAndCompute後的使用empty()的情況下,這樣的:

detector->detectAndCompute(img_1, noArray(), keypoints_1, descriptors_1); 
    detector->detectAndCompute(img_2, noArray(), keypoints_2, descriptors_2); 

    if (descriptors_1.empty()) { 
    cvError(0,"MatchFinder","descriptors_1 descriptor empty",__FILE__,__LINE__); 
    } 
    if (descriptors_2.empty()) { 
    cvError(0,"MatchFinder","descriptors_2 empty",__FILE__,__LINE__); 
    }