2013-05-10 102 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