0

2 つの画像を照合し、回転とスケールを出力する MATLAB の例があります: https://de.mathworks.com/help/vision/examples/find-image-rotation-and-scale-using-automated-feature-matching. html?requestedDomain=www.mathworks.com

私の目標は、C++ を使用してこの例を再現することです。私はキーポイント検出 (Harris) の同じ方法を使用しており、キーポイントは Matlab が見つけたものとほとんど同じようです。ここまでは順調ですね。

cv::goodFeaturesToTrack(image_grayscale, corners, number_of_keypoints, 0.01, 5, mask, 3, true, 0.04);
    for (int i = 0; i < corners.size(); i++) {
        keypoints.push_back(cv::KeyPoint(corners[i], 5));
    }

BRISK は、キーポイントから特徴を抽出するために使用されます。

int Threshl = 120;
int Octaves = 8;
float PatternScales = 1.0f;

cv::Ptr<cv::Feature2D> extractor = cv::BRISK::create(Threshl, Octaves, PatternScales);
extractor->compute(image, mykeypoints, descriptors);

これらの記述子は、flannbasedmatcher を使用して照合されます。

cv::FlannBasedMatcher matcher;
matcher.match(descriptors32A, descriptors32B, matches);

問題は、私の一致の約 80% が間違っていて使用できないことです。同一の画像セットに対して、Matlab は 20% 程度しか間違っていない 2 つの一致のみを返します。距離の値に基づいて C++ で Matches をソートしようとしましたが、成功しませんでした。値の範囲は 300 から 700 で、最も短い距離の一致でさえ、ほとんど完全に正しくありません。

現在、20% の適切な一致でオフセットを計算するのに十分ですが、間違った一致をチェックするために多くの処理能力が浪費されています。正しい一致をソートするためのより良い方法は何ですか、または私が間違っていることは明らかですか?

編集:

Harris/BRISK から AKAZE に切り替えました。これは、はるかに優れた機能と、距離の値で簡単に並べ替えることができる一致を提供するようです。唯一の欠点は、計算時間が非常に長くなることです。2 つの 1000px 幅の画像を使用すると、AKAZE は (PC 上で) キーポイントを見つけるのに 30 分かかります。許容範囲の 3 ~ 5 秒になるように画像を縮小することで、これを減らしました。

4

1 に答える 1