2011-04-17 63 views
3

http://opencv.willowgarage.com/documentation/cpp/features2d_common_interfaces_of_descriptor_matchers.html#flannbasedmatcher如何使用基於flann的匹配器,或者通常在opencv中使用flann?

請有人向我展示示例代碼或告訴我如何使用這個類和方法。 我只想將查詢圖像中的SURF與通過應用Flann設置的圖像匹配。我在樣本中看到了很多圖像匹配代碼,但是我仍然沒有找到量化圖像與其他圖像相似程度的指標。任何幫助都感激不盡。

回答

10

這裏的未經測試示例代碼

using namespace std; 
using namespace cv; 

Mat query; //the query image 
vector<Mat> images; //set of images in your db 

/* ... get the images from somewhere ... */ 

vector<vector<KeyPoint> > dbKeypoints; 
vector<Mat> dbDescriptors; 

vector<KeyPoint> queryKeypoints; 
Mat queryDescriptors; 

/* ... Extract the descriptors ... */ 

FlannBasedMatcher flannmatcher; 

//train with descriptors from your db 
flannmatcher.add(dbDescriptors); 
flannmatcher.train(); 

vector<DMatch > matches; 

flannmatcher.match(queryDescriptors, matches); 

/* for kk=0 to matches.size() 

     the best match for queryKeypoints[matches[kk].queryIdx].pt 
     is dbKeypoints[matches[kk].imgIdx][matches[kk].trainIdx].pt 

*/ 

找到最「類似」的圖像與查詢圖像取決於你的應用。也許匹配關鍵點的數量是足夠的。或者您可能需要更復雜的相似度量度。

+0

感謝您的回覆,「queryKeypoints [matches [kk] .queryIdx] .pt 的最佳匹配是dbKeypoints [matches [kk] .imgIdx] [matches [kk] .trainIdx] .pt」如何做到這一點部分,如何確定最佳匹配,要實現的算法或opencv中的方法。 – AquaAsh 2011-04-18 07:28:28

+0

函數調用flannmatcher.match(queryDescriptors,matches);做匹配。你所要做的就是使用向量匹配中的索引。 – Sammy 2011-04-18 12:21:18

+0

對不起,遲到的答覆,謝謝,我終於明白了索引的事情。無論如何,我試圖減少誤報,你能否提出任何複雜的相似度量。 – AquaAsh 2011-04-25 13:32:54

1

爲了減少誤報的次數,您可以通過比較那些距離的比率來比較第一個最靠近的第二個最鄰近的鄰居。 distance(query,mostnearestneighbor)/ distance(query,secondnearestneighbor)< T,比值越小,第二個最近鄰居與查詢描述符的距離越大。這因此是高度獨特性的翻譯。用於設計註冊的許多計算機視覺論文。