如何找到最好的匹配使用SURF OpenCV使用c++

How to find the best match using SURF OpenCV using C++?

本文关键字:SURF OpenCV c++ 使用 何找      更新时间:2023-10-16

我使用OpenCV c++,在VS2010中用于人脸识别应用程序。为此,我使用了SURF, BruteForceMatcher。

BFMatcher matcher;
    vector< DMatch > matches;
//match: execute the matcher!
    matcher.match(descriptors1,descriptors2, matches);

我想知道当我调用这个方法时到底发生了什么。我的手势是"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;
    }

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

谢谢。

如果有人能帮我找出这个,我会很感激。谢谢。

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

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

SURF特征倾向于使用快速近似近邻搜索进行匹配。在openv网站上有一个使用它的教程。