10

OpenCVチュートリアルページからFLANNとの機能マッチングのコードをコピーし、次の変更を加えました。

  • SURFの代わりにSIFT機能を使用しました。
  • 「良い一致」のチェックを変更しました。それ以外の

    if( matches[i].distance < 2*min_dist )
    

使用しました

    if( matches[i].distance <= 2*min_dist )

そうしないと、画像をそれ自体と比較するときに、適切な一致がゼロになります。

  • キーポイントを描画する際の変更されたパラメータ:

    drawMatches( img1, k1, img2, k2,
                     good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
                     vector<char>(), DrawMatchesFlags::DEFAULT);
    

INRIA-HolidaysデータセットのIrelandフォルダー内のすべての画像からSIFTを抽出しました。次に、各画像を他のすべての画像と比較して、一致するものを描画しました。

ただし、過去に使用した他のSIFT/Matcher実装では経験したことがない奇妙な問題があります。

  • 私が自分自身と照合した画像の一致は良好です。一部を除いて、各キーポイントはそれ自体にマップされます。上の画像を参照してください。それ自体と一致する画像
  • Iを別の画像J(JはIと等しくない)と照合すると、多くの点が同じ画像にマッピングされます。いくつかの例を以下に示します。 一致する 一致する一致する

OpenCVチュートリアルから同じコードを使用し、私のものとは異なる経験を報告できる人はいますか?

4

1 に答える 1

1

matcher_simple.cpp の例を確認してください。かなりうまく機能するように見えるブルート フォース マッチャーを使用します。コードは次のとおりです。

// detecting keypoints
SurfFeatureDetector detector(400);
vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img1, keypoints1);
detector.detect(img2, keypoints2);

// computing descriptors
SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(img1, keypoints1, descriptors1);
extractor.compute(img2, keypoints2, descriptors2);

// matching descriptors
BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

// drawing the results
namedWindow("matches", 1);
Mat img_matches;
drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
imshow("matches", img_matches);
waitKey(0);
于 2013-02-20T17:41:46.547 に答える