3

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

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

2 回答 2

4

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

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

于 2013-05-10T13:45:02.467 回答
1

SURF 特征倾向于使用Fast Approximate Nearest Neighbor Search进行匹配。在 opencv 网站上有一个使用它的教程

于 2013-05-10T13:49:20.517 回答