2

将图像 A 中的二进制描述符匹配到一组图像 B*,我碰巧尝试将“火车”和“查询”图像反转为以下函数:

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 之间的匹配相同,但显然不是这样。这是为什么?

4

1 回答 1

2

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

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

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

于 2013-03-26T09:25:29.513 回答