如何使用C ++使用SURF OpenCV找到最佳匹配?

时间:2013-05-10 04:57:12

标签: c++ opencv face-recognition surf

我在VS2010中使用OpenCV C ++进行人脸识别应用。为此,我使用了SURF,BruteForceMatcher。

BFMatcher matcher;
    vector< DMatch > matches;

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

我想知道调用此方法时到底发生了什么。 我的手势是&#34;匹配&#34;向量将填充匹配的关键点。

无论如何,我可以使用这个&#34;匹配&#34;矢量找到好的比赛?
目前,我正在做这样的事情,以获得最小距离和最大距离:

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;
    }

如果我的上述方法是正确的,我如何使用最小距离和最大距离来检查图像是否匹配。

感谢。

如果有人能为我找到这个,我将不胜感激。 感谢。

2 个答案:

答案 0 :(得分:4)

您可以尝试使用knnMatch()方法匹配图像,计算两个最近邻居。对于第一张图像中的每个描述符,您将在第二张图像中具有2个最接近的匹配。

这些匹配是基于描述符之间距离的两个最佳匹配。如果这些匹配的距离相似,则可能会选择错误的距离。在这种情况下,你应该丢弃那些比赛。你可以通过检查距离比来做到这一点。 如果第一场比赛和第二场比赛之间的距离比率不大于选定的门槛,则应丢弃这些比赛。 之后,您可以进行RANSAC测试,以获得更好的结果。

答案 1 :(得分:1)

SURF功能倾向于使用Fast Approximate Nearest Neighbour Search进行匹配。有一个关于在opencv网站here上使用它的教程。