我没有处理您正在使用的确切模块,但来自文档:
http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html
似乎第二个调用是用查询交换训练,因此可以给你一组不同的结果。将matches12 的命名更改为matches21 也暗示了这一点——这不是双向关联,而是方向关联。
您可以在机器学习中训练大型数据集时看到这一点,其中训练数据子集的结果比训练不同数据子集的性能更好。我不知道在您编写的步骤之后如何使用这两个匹配项,但我想它允许选择最佳训练,或者从数据中捕获更好的协方差信息。
欧几里得距离在两个方向上都是相同的,但是双向量的顺序会发生变化,因此两个调用之间的关联结构也会发生变化(除非描述符 1 == 描述符 2,这将形成一个对称矩阵,然后可能无法重复)。
稍后在代码库中发布matches12 和matches21 的使用可能也会阐明具有两个方向关联的确切原因。
希望这为理解重复调用提供了一个起点。
*编辑*
我查看了您提供的链接并回答您的问题的源代码,两点之间的距离相同,但特定点(A点)到另一个特定点(B点)的最近点不一定一个可反转的语句。因此 B 可能是离 A 最近的点,但 A 可能不是离 B 最近的点。
正如 Frédéric 的帖子以图形方式显示的那样,不是欧几里得距离在 2 个点之间发生变化,而是欧几里得距离最近的点在改变比较的视角时会发生变化。因此,交叉检查可以验证共享最近点关系的点(A 最接近 B,B 最接近 A)。
您认为这不是最佳方法(具有大量点)的直觉是正确的,因为更复杂的方法可以在 O(N*ln(N)) 时间而不是 O(N^2) 时间内找到所有此类关系- 特别是启发式驱动的搜索。但是对于(相对)少量的点,预期的性能增益将可以忽略不计,并且实现将(为了更好的改进)更加复杂。