私はあなたが使用している正確なモジュールを扱っていませんが、ドキュメントから:
http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html
2 番目の呼び出しはトレーニングをクエリと交換しているように見えるため、異なる結果セットが得られる可能性があります。これは、マッチ 12 の名前がマッチ 21 に変更されていることからも示唆されています。これは、双方向の関連付けではなく、方向の関連付けです。
これは、機械学習で大規模なデータセットをトレーニングする場合に見られます。データの 1 つのサブセットをトレーニングすると、データの別のサブセットでトレーニングするよりも優れたパフォーマンスが得られます。あなたが書いたステップの後に2つの一致がどのように使用されるかはわかりませんが、最良のトレーニングを選択するか、データからより良い共分散情報を取得できると思います.
ユークリッド距離は両方向で同じですが、double ベクトルの順序が変わるため、2 つの呼び出し間で関連付けの構造が変わります (記述子 1 == 記述子 2 の場合を除きます。これは対称行列を形成し、おそらく繰り返しても無駄になります)。
コードベースの後半でmatchs12とmatchs21の使用を投稿すると、おそらく両方向の関連付けを持つ正確な理由も明らかになるでしょう。
これが、繰り返される呼び出しを理解するための出発点になることを願っています。
*編集*
あなたがリンクを提供したソースコードを調べて、あなたの質問に答えて、距離は2つのポイント間で同じですが、特定のポイント(ポイントA)から別の特定のポイント(ポイントB)への最も近いポイントは必ずしもそうではありません反転可能なステートメント。したがって、B は A に最も近い点かもしれませんが、A は B に最も近い点ではないかもしれません。
フレデリックの投稿がグラフで示しているように、ユークリッド距離が 2 点間で変化するのではなく、比較のパースペクティブを変更すると、ユークリッド距離が最も近い点が変化する可能性があります。したがって、クロスチェックにより、最も近いポイント関係を共有するポイントを検証できます (A は B に最も近く、B は A に最も近い)。
ただし、これが最良のアプローチではないというあなたの直感は正しいですが、より複雑なアプローチでは、O(N^2) 時間ではなく O(N*ln(N)) 時間でそのような関係をすべて見つけることができます。 -- 特にヒューリスティック駆動の検索。しかし、(比較的) 少数のポイントの場合、期待されるパフォーマンスの向上はごくわずかであり、実装は (かなりの改善のために) より複雑になります。