我在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;
}
如果我的上述方法是正确的,我如何使用最小距离和最大距离来检查图像是否匹配。
感谢。
如果有人能为我找到这个,我将不胜感激。 感谢。
答案 0 :(得分:4)
您可以尝试使用knnMatch()
方法匹配图像,计算两个最近邻居。对于第一张图像中的每个描述符,您将在第二张图像中具有2个最接近的匹配。
这些匹配是基于描述符之间距离的两个最佳匹配。如果这些匹配的距离相似,则可能会选择错误的距离。在这种情况下,你应该丢弃那些比赛。你可以通过检查距离比来做到这一点。 如果第一场比赛和第二场比赛之间的距离比率不大于选定的门槛,则应丢弃这些比赛。 之后,您可以进行RANSAC测试,以获得更好的结果。
答案 1 :(得分:1)
SURF功能倾向于使用Fast Approximate Nearest Neighbour Search进行匹配。有一个关于在opencv网站here上使用它的教程。