私は短い質問があります:OpenCVでフィーチャマッチングを行うと、distance
という属性の意味はDMatches
となり、MatOfMatches
になるのでしょうか?DMatchesの距離属性は何を意味しますか?
私は、距離が遠いほどマッチをフィルタリングする必要があることを知っています。しかし、この属性の意味は何ですか?それは一種の逸脱ですか?
私は短い質問があります:OpenCVでフィーチャマッチングを行うと、distance
という属性の意味はDMatches
となり、MatOfMatches
になるのでしょうか?DMatchesの距離属性は何を意味しますか?
私は、距離が遠いほどマッチをフィルタリングする必要があることを知っています。しかし、この属性の意味は何ですか?それは一種の逸脱ですか?
に等しい、機能はのポイントですイメージへの関心。フィーチャを比較するには、フィーチャディテクタを使用してフィーチャを「記述」します。各機能は、記述子に関連付けられます。フィーチャにマッチすると、実際にフィーチャの記述子に一致します。
記述子は多次元ベクトルです。 実数値(たとえばSIFT)またはバイナリ(たとえばBRIEF)にすることができます。
マッチングは、各イメージから1つの記述子のペアであり、すべての記述子の中で最も類似しています。もちろん、イメージAの記述子に最も類似しているイメージBの記述子を見つけるには、この類似性の尺度が必要です。
2つのベクトル間に「類似点」を計算する方法は複数あります。実数値の記述子の場合、Hamming distanceがバイナリ記述子に共通である場合、Euclidean distanceがよく使用されます。
結論として、distance
属性を理解できるようになりました。これは、一致の2つの記述子の間の類似性スコアです。
通常、2つのフィーチャを一致させる場合、特定の距離メトリックで2つのベクトルを実際に比較しています。今度は、あなたの機能は128の寸法でSIFTであると仮定しましょう、そしてあなたは、ユークリッド距離を使用して2つのSIFT特徴a
とb
を比較し、その後、DMatch.distance
この文脈において
Google APIのヒントありがとうございました;-) – stetro
DMatchの距離属性は、2つの記述子(特徴ベクトル)間の類似性の尺度です。距離が小さい場合、画像はより類似し、逆も同様である。私が始めたとき
教訓は、私の経験から学んだ:
は、2点間の通常空間距離とDMatch.distanceを混同しないでください。どちらも違います。 DMatchの距離がSIFT(局所特徴記述子)の場合には2つのディスクリプタ(SIFTの場合には128個の値を有するベクトル)
間の距離を表す:
1)まず、キーポイント(検出します興味深い点)を比較したいと思う2つのイメージのために。
2)次に、すべてのキーポイントの周りに定義された領域(各キーポイントの周りの16×16近傍)のシフト記述子を計算します。各記述子は、各キーポイントの周りの領域に対する方向付けられた勾配のヒストグラムを記憶する。
3)最後に、両方の画像の記述子を一致させて、画像間の一致するキーポイントを見つけます。これは、BFMatcher - > match()、knnMatch()またはFlannBasedMatcher - > knnMatch()を使用して行います。
4)BFMatcher.match()を使用している場合は、DMatchオブジェクトのリストが表示されます。 DMatchオブジェクトの数は一致する数に等しい。各DMatchオブジェクトには、一致するキーポイントペアごとに次の4つの属性が含まれています。
DMatch.distance - Distance between descriptors. The lower, the better it is.
DMatch.trainIdx - Index of the descriptor in train descriptors(1st image)
DMatch.queryIdx - Index of the descriptor in query descriptors(2nd image)
DMatch.imgIdx - Index of the train image.
5)DMatch.Distanceは多くの距離尺度の一つであることができる - > Norm_L1、Norm_L2(ユークリッド距離)、ハミング距離、Hamming2距離、... BFMatcherのパラメータとして挙げることができます。デフォルト距離はユークリッド距離です。空間ユークリッド距離とDMatchユークリッド距離と
6)差:
SIFT記述子1 - > [B1、 - > A1、A2、... A128]
SIFT記述子2 (a1-b1)^ 2 +(a2-b2)^ 2 + ... +(a128-b128)^ 2(b1、b2、... b128)
]
ポイント1 - >(x1、y1)
ポイント2 - >(X2、Y2)
(空間) - >ユークリッド距離= SQRTの[(X2-X1)^ 2 +(Y2-Y1)^ 2]
従ってこのDMatchからの距離は記述子間の距離であり、2つの記述子間の類似度を表し、2点間の通常の空間的ユークリッド距離とは異なる。
ディスクリプタ間の距離が小さい場合、その類似度は高くなります。ディスクリプタ間の距離がより大きい場合、それらの類似性は低い。
DMatchオブジェクトのdistance属性の意味を理解するのに役立ちます。これではっきりしていれば、HOG、SIFT、SURF、ORB、BRISK、FREAKなどの任意のフィーチャ記述子で作業することができます。それぞれのフィーチャ記述子のマッチングについては、すべて同じです。
おかげさまで、ありがとうございました!それは非常に啓発されていました;-) – stetro
1つの短い質問が残っていますが、明らかに同じアルゴリズムではない場合、なぜマッチングアルゴリズムによって大きな距離が得られますか? – stetro
彼らはあなたが持っている記述子に_best_一致w.r.tを与えます。いくつかは正しい、いくつかは正しくありません。アウトライヤーを除外するためのさまざまな手法がありますが、最良のものは状況によって異なり、これはマッチャー自体の仕事ではありません。 – JonesV