2013-05-10 104 views
3

我在VS2010中使用OpenCV C++進行人臉識別應用程序。爲此,我使用了SURF,BruteForceMatcher。如何使用C++使用SURF OpenCV找到最佳匹配?

BFMatcher matcher; 
    vector<DMatch> matches; 

//match: execute the matcher! 
    matcher.match(descriptors1,descriptors2, matches); 

我想知道當我調用此方法時究竟發生了什麼。 我的手勢是「匹配」向量將填充匹配的關鍵點。

而且

反正我可以用這個「匹配」矢量找到好的比賽嗎?
目前,我做這樣的事情,讓最小距離和最大距離:

for(int i = 0; i < descriptors1.rows; i++) 
    { 
     double dist = matches[i].distance; 
     if(dist < min_dist) min_dist = dist; 
     if(dist > max_dist) max_dist = dist; 
    } 

如果我的上述做法是正確的,我怎麼能用最小距離和最大距離檢查圖像是否匹配。

謝謝。

如果有人能爲我找到這個,我將不勝感激。 謝謝。

回答

4

你可以嘗試匹配圖像與knnMatch()方法,計算兩個最近的鄰居。對於第一張圖片中的每個描述符,您將在第二張圖片中有2個最接近的匹配。

這些匹配是基於它們的描述符之間的距離的兩個最好的匹配。如果這些匹配的距離相似,則可能會選擇錯誤的一個。在這種情況下,你應該放棄這些比賽。你可以通過檢查距離比例來做到這一點。 如果第一場比賽和第二場比賽之間的距離比率不大於選定的門檻,您應該放棄這些比賽。 之後,您可以做一個RANSAC測試來獲得更好的結果。

+0

非常感謝J-X320,mada的快速反應。我嘗試了knnMatch()方法。它給了我很好的結果。謝謝。 – posha 2013-05-10 17:30:05