为什么BFMatcher :: match()在OpenCV中不对称?

时间:2013-03-20 08:13:21

标签: opencv match

将图像A中的二进制描述符与一组图像B *相匹配,我碰巧尝试将“train”和“query”图像反转为以下函数:

cv::BFMatcher matcher;
matcher.match(queryDescriptors, trainDescriptors, matches);

第一点是函数不对称,即match(trainDescriptors,queryDescriptors,matches)不会给出相同数量的匹配。

其次是如果我使用A作为查询图像,并且B *作为火车图像(在for循环中),那么我总是从A到B *的图像获得相同数量的匹配(例如,如果A - > B1有155个匹配,那么A - > Bx都有155个匹配。)

但如果我做相反的事情(即使用B *作为查询图像而A作为火车图像),那么每次匹配的数量都不同(这对我来说似乎更合乎逻辑)。

直观地说,我会说A和Bx之间的匹配应该与Bx和A之间的匹配相同,但显然并非如此。为什么?

1 个答案:

答案 0 :(得分:2)

BFMatcher :: match()实际上为查询图像的每个描述符返回与火车图像的最佳匹配。由此,我们可以得出结论:

  • 匹配数始终是查询图像的描述符数
  • 这是不对称的:假设描述符Ax的最佳匹配是Bz,并且描述符Ay的最佳匹配是Bz(即A上的两个描述符与B中的相同描述符匹配),那么我们清楚地看到Bz的最佳匹配是Ax或Ay,但不是两者。

假设之后进行几何验证(例如使用单应性),那么最好选择查询图像和火车图像,以使匹配数最大化。