opencvでのDMatchの説明
Dmatch Explanation Opencv
queryIdx:クエリポイントのインデックス(現在探している画像上のポイントのインデックス)。 trainIdx:照会されているポイントのインデックス(リポジトリ上のリポジトリ内のポイントのインデックス)imgIdx:物議を醸す(多くの場合0)
具体的な説明、検証プロセス
図1からふるい/サーフ/オーブまたは他の種類の特徴点を抽出しました。vector keypoints_1
および対応する記述子descriptor1
、サイズは319で、特徴点も図2から抽出されます。vector keypoints_2
そして対応する記述子descriptor2
サイズは320です。
// descriptor1
d1i
の各特徴点の説明、descriptor2
d2i
の各特徴点の説明。
/ / Match through the opencv `FlannBasedMatcher` or `BruteForceMatcher`, // Pick two recent descriptors from `d1i` in descriptor2 and put them in matches. FlannBasedMatcher matcher std::vector matches matcher.knnMatch(descriptor1,descriptor2,matches,2)
デバッグにより、次の図に示すような結果が得られます。
見られます queryIdxは順番に増加し、対応するtrainIdxは絶えず変化し、imgIdxは常に0です。
はmatches [0]から見ることができます。ここで、queryIdxは、0番目の画像の0番目の特徴点が1番目の画像の6番目の特徴点と一致することを意味します(最も近いものからの距離)同時に、0番目の画像の0番目の特徴点は1枚目の画像の128番目の特徴点(距離2番目)に一致します。
その後、 queryIdxは、「it」に一致するものを検索する「it」のインデックスです。 trainIdxは、「it」の一致結果のインデックスです。
imgIdxは常に0であるため、ここでは役に立たないとしか言えません。 imgIdxが0番目の画像を参照していると言う記事もあれば、最初の画像の意味を述べている記事もあります。ここからは、0枚目の写真のようになります。
DMatchの定義
/* * Struct for matching: query descriptor index, train descriptor index, train image index and distance between descriptors. */ struct CV_EXPORTS_W_SIMPLE DMatch { CV_WRAP DMatch() : queryIdx(-1), trainIdx(-1), imgIdx(-1), distance(FLT_MAX) {} CV_WRAP DMatch( int _queryIdx, int _trainIdx, float _distance ) : queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(-1), distance(_distance) {} CV_WRAP DMatch( int _queryIdx, int _trainIdx, int _imgIdx, float _distance ) : queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(_imgIdx), distance(_distance) {} CV_PROP_RW int queryIdx // query descriptor index CV_PROP_RW int trainIdx // train descriptor index CV_PROP_RW int imgIdx // train image index CV_PROP_RW float distance // less is better bool operator<( const DMatch &m ) const { return distance < m.distance } }