2

ロゴ検出アルゴリズムを実装するために、Android用のopenCVを使用しています。私の目標は、Android カメラで撮影した写真で定義済みのロゴを見つけることです。

正しい一致を取得できません..ほとんどopenCVライブラリ関数のみを使用していることを考えると、これは非常に奇妙だと思います。

最初に FAST 検出器を使用してキーポイントを検出します。画像のサイズは 500x500 です。その後、SURF を使用してこれらのキーポイントを記述します。knn で 2 つのベスト マッチを求め、A 比率が 0.6 (first.distance/second.distance) より小さいものを除外します。

私は約10試合を獲得していますが、それらはすべて間違っています.すべての試合(100以上)を描くと、それらはすべて間違っているようです.

ここで何が間違っているのかわかりません。同じ問題を抱えている人はいますか、それとも私が間違っていることを知っていますか?

    FeatureDetector FAST = FeatureDetector.create(FeatureDetector.FAST);

    // extract keypoints
    FAST.detect(image1, keypoints);
    FAST.detect(image2, logoKeypoints);

    DescriptorExtractor SurfExtractor = DescriptorExtractor
            .create(DescriptorExtractor.SURF);
    Mat descriptors = new Mat();
    Mat logoDescriptors = new Mat();

    SurfExtractor.compute(image1, keypoints, descriptors);
    SurfExtractor.compute(image2, logoKeypoints, logoDescriptors);

    List<DMatch> matches = new ArrayList<DMatch>();
    matches = knn(descriptors, logoDescriptors);
    Scalar blue = new Scalar(0, 0, 255);
    Scalar red = new Scalar(255, 0, 0);
    Features2d.drawMatches(image2, logoKeypoints, image1, keypoints,
            matches, rgbout, blue, red);
4

1 に答える 1

3

問題は、使用しているマッチャーだと思います。(SURF) ディスクリプタなどの浮動小数点ベースの場合、マッチャーとして FLANN を使用するか、マッチャーとして BRUTEFORCE を使用します。また、抽出と照合の両方に同じ特徴記述子を使用するように努めます...つまり、SURF キーポイントの SURF 特徴です。

理解を深めるために、stackoverflow に関するこの投稿と、そこにリンクされている記事をお読みください。 OpenCV ORB Feature Detector はどのように機能しますか?

于 2012-04-24T06:53:02.320 に答える