2 つの画像 A と B があります。それらからキーポイント (a[i] と b[i]) を抽出します。
a[i] と b[j] の一致を効率的に判断するにはどうすればよいでしょうか。
明白な方法は、A の各ポイントを B の各ポイントと比較することですが、大規模な画像データベースでは時間がかかります。ポイントa[i]とb[k]だけを比較するにはどうすればよいですか
kd-treeが良い選択かもしれないと聞きましたね。kd-treeに関する良い例はありますか?
他の提案はありますか?
2 つの画像 A と B があります。それらからキーポイント (a[i] と b[i]) を抽出します。
a[i] と b[j] の一致を効率的に判断するにはどうすればよいでしょうか。
明白な方法は、A の各ポイントを B の各ポイントと比較することですが、大規模な画像データベースでは時間がかかります。ポイントa[i]とb[k]だけを比較するにはどうすればよいですか
kd-treeが良い選択かもしれないと聞きましたね。kd-treeに関する良い例はありますか?
他の提案はありますか?
KD ツリーは、マッチングを実行するときに最も類似した記述子を見つけるのが本当に高速になるように、トレーニングされた記述子を格納します。
OpenCV を使用すると、kd-tree を非常に簡単に使用できます。flann マッチャーの例を示します。
flann::GenericIndex< cvflann::L2<int> > *tree; // the flann searching tree
tree = new flann::GenericIndex< cvflann::L2<int> >(descriptors, cvflann::KDTreeIndexParams(4)); // a 4 k-d tree
次に、マッチングを行うと、次のようになります。
const cvflann::SearchParams params(32);
tree.knnSearch(queryDescriptors, indices, dists, 2, cvflann::SearchParams(8));
問題は、実際に 2 つの画像間のキーポイント マッチングを決定したい、または類似度を計算したい天気です。
一致を判断したい場合は、2 つの画像間で考えられるすべての記述子ペアを力ずくで検索する必要があります (FLANN - 高速近似最近傍検索など、より高度な方法がいくつかありますが、スピードアップは画像ごとに 2000 個以下のキーポイントがある場合は重要ではありません (少なくとも私の経験では)。より正確なマッチングを取得するには (高速ではなく、より適切なマッチング)、以下を参照することをお勧めします。
一方、大規模なデータベースで類似性測定のみが必要な場合は、次の場所から開始するのが適切です。