修士論文のために、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の一致すべてを描画しますが、この場合はもちろん正しいです。
この同様の問題が処理された投稿が見つかりません。誰かがこの問題を抱えているか、ここで私が間違っていることを知っていますか?
よろしくお願いします。