gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:37:45 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于opencv - 为什么 BFMatcher::match() 在 OpenCV 中不对称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15518344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com