2

Android用のスマートフォンで、2つの画像を比較できるアプリケーションを作成しています(SDカードに1つ、カメラから1つ)。そこで、限られた量のキーポイントで FREAK 記述子を使用します (応答に従って 500 の最良のものを除外しました)。BRUTEFORCE_SL2 と照合しようとすると、0 の一致が返されます。

これは、FREAK と Bruteforce がうまく連携しないためですか? または、コードで何か間違ったことをしましたか?

マッチングは

MatOfDMatch matches = new MatOfDMatch();

            matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2);
            matcher.match(descriptors,descriptors1,matches);
            MatOfDMatch goedematches = new MatOfDMatch();

            double max_dist = 0;
            double min_dist = 100;
            //if (descriptors.cols() == descriptors1.cols())
            //{
            for( int i = 0; i < descriptors.rows(); i++ )
            { double dist = matches.toArray()[i].distance;
              if( dist < min_dist ) min_dist = dist;
              if( dist > max_dist ) max_dist = dist;
            }
            // should only draw good matches
           for( int i = 0; i < descriptors.rows(); i++ )
            {  MatOfDMatch temp = new MatOfDMatch();
               if( matches.toArray()[i].distance < 3*min_dist )
               {   temp.fromArray(matches.toArray()[i]);
                   goedematches.push_back(temp); 
                   }        
           // }
            }

           Log.d("LOG!", "Number of good matches= " + goedematches.size());

私がちょうどやるとき

matcher.match(descriptors,descriptors1,matches);

一致を読み上げる

Log.d("LOG!", "Number of good matches= " + matches.size());

自分のイメージと違うものを撮っても450くらいです。

4

1 に答える 1

2

まず、FREAK はバイナリ記述子を作成します。したがって、ユークリッド距離の代わりにハミング距離を使用する必要があります (ここでは意味がありません)。

matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);

ハミング距離は、実際には記述子ごとに異なるビット数をカウントします。

次に、Matcher はにある記述子に対して最適な対応 のみを見つけることを知っておくことが重要です。そのため、一致が予想よりも少ない場合は、前の手順 (特徴の検出と記述子の抽出) を確認する必要があります。descriptors

編集:画像が完全に異なる場合でも、各記述子に最適な一致が得られます (この一致が実際に間違っていても)。ドキュメント内のサンプル コードは、距離が より大きいかどうかをテストすることで、より悪い一致を除外することを提案しています3*min_dist。しかし、これは間違った一致を排除しません! 2 つの完全に異なるイメージがあることを検討してください。実際にはそれらはすべて間違った一致ですが、アルゴリズムはbestそれらの可能な一致を見つけます...本当に「正しい」一致を維持したい場合は、より高度なフィルタリング手法を使用する必要があります(ただし、これは別の問題です)。 .

最後に (マッチャーの理解のために) 言及したいのは、matcher.match()対称ではないということです。

matcher.match(descriptors,descriptors1,matches);

は、の各記述子についてdescriptors、 の最適な対応descriptors1を見つけます。逆が成り立たない場合もあります (納得するために試してみてください)。

「対称ではない」という意味のより詳細な例を次に示します。 image に記述子があり、Aiimageを image にA一致させるとします。に最適な対応となります。ABBiBAi

ここで、画像Bと画像を一致させると、 for でA最適な対応が得られます。しかし、よりも に似ている とは異なるが存在する可能性があります。ABiAjAiBiAj

この場合、 に一致AするBと対応が得られますが、Ai <-> Biに一致Bすると明らかに同じではないA対応が得られます。Bi <-> Aj

于 2013-05-01T16:32:41.817 に答える