2

修士論文のために、Android用のロゴ検出アルゴリズムを実装する必要があります。私は現在、NDKでopenCV androidライブラリを使用しており、SURFを使用してこれらのキーポイントのキーポイントとセットアップ記述子を検出することができました。

私にとっての次のステップは、knnMatchを使用して、すべてのキーポイントに最も近い2つの一致を見つけることです。その後、2番目の一致と比較して最良のknn一致があまり区別できない一致を破棄します(これら2つの距離の比率が低すぎます)。私のコードの一部:

private static List<DMatch> knn(Mat queryDescriptors, Mat trainDescriptors) {
    List<List<DMatch>> matches = new ArrayList<List<DMatch>>();
    List<DMatch> retMatches = new ArrayList<DMatch>();
    DescriptorMatcher matcher = DescriptorMatcher
            .create(DescriptorMatcher.BRUTEFORCE);
    matcher.knnMatch(queryDescriptors, trainDescriptors, matches, 2);

ここでの私の問題は、たとえばクエリロゴに500個の記述子があり、電車のロゴに400個の記述子がある場合、knnは500個の一致を返しますが、すべてが1つの同じキーポイントに対するものです。通常、すべての記述子に対して2つの最適な一致が返されるため、500の異なる記述子が返されますが、1つの同じ記述子に対して500倍の最適な一致が返されます。

したがって、これらのknnマッチを描画すると、常に同じキーポイント間に500回描画された1つのマッチラインがあります。

単純にベストマッチを返すシンプルマッチャーを試してみると、より多くの行が得られます。画像をそれ自体と比較してこれをテストしました。Knnは、この1行を返します。ここで、単純な一致は500の一致すべてを描画しますが、この場合はもちろん正しいです。

この同様の問題が処理された投稿が見つかりません。誰かがこの問題を抱えているか、ここで私が間違っていることを知っていますか?

よろしくお願いします。

4

1 に答える 1

3

次回OpenCVでバグに直面したときは、OpenCVバグトラッカーで既に送信されているかどうかを確認し、見つからない場合は新しいバグを送信してください。あなたが直面したのは、C ++マッチャーへのJNIラッパーのバグであり、修正はOpenCVトランクにコミットされたばかりです。ただし、OpenCV-2.3.1のコピーでローカルに作成できます。これは、1行のコードにすぎません。

  1. OpenCV-2.3.1 Androidライブラリプロジェクト(Converters.java)でorg.opencv.utils.Converters :: Mat_to_vector_vector_DMatch(Mat m、List> lldm)を開きます
  2. 行を2行下に移動してList<DMatch> ldm = new ArrayList<DMatch>();、サイクルの最初の行にしますfor (Mat mi : mats)
  3. OpenCV-2.3.1プロジェクトと独自のプロジェクトをEclipseで再構築します
  4. マッチャーが正しい結果を返すようになったことを確認してください
于 2012-02-29T12:32:23.660 に答える