【问题标题】:How to find the best match using SURF OpenCV using C++?如何使用 C++ 使用 SURF OpenCV 找到最佳匹配?
【发布时间】:2013-05-04 17:38:16
【问题描述】:

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

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

谢谢。

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

【问题讨论】:

    标签: c++ opencv face-recognition surf


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢 J-X320,mada 的快速响应。我尝试了 knnMatch() 方法。它给了我很好的结果。谢谢。
    【解决方案2】:

    SURF 特征倾向于使用Fast Approximate Nearest Neighbour Search 进行匹配。在opencv网站here上有使用教程。

    【讨论】:

      猜你喜欢
      • 2016-06-30
      • 1970-01-01
      • 2012-04-10
      • 2012-12-31
      • 2021-06-11
      • 2014-08-26
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多