Я должен реализовать алгоритм обнаружения логотипа для Android для моего мастерства.В настоящее время я использую библиотеку android openCV с NDK, и мне уже удалось обнаружить ключевые точки и дескрипторы настройки для этих ключевых точек, используя SURF.
Следующий шаг для меня - найти 2 ближайших совпадения для каждой ключевой точки, используя knnMatch , после этого я выбрасываю спички, где лучшее совпадение knn не очень различимо по сравнению со вторым (соотношение расстояний этих двух слишком мало), вот часть моего кода:
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 совпадений, но каждый относится к одной и той же ключевой точке.Обычно он возвращает 2 лучших совпадения для каждого дескриптора, поэтому 500 различных дескрипторов, теперь они возвращают 500 кратных лучших совпадений для одного и того же дескриптора.
Поэтому, когда я рисую эти совпадения knn,1 линия соответствия, проведенная 500 раз между всегда одинаковыми ключевыми точками
Когда я пытаюсь использовать простое сопоставление, которое просто возвращает наилучшее совпадение, я получаю больше строк.Я проверил это, сравнив изображение с самим собой.Познайте эту строку, где простое совпадение отображает все 500 совпадений, которые в данном случае верны.
Я не могу найти ни одного поста, где рассматривается подобная проблема, была ли у кого-нибудь эта проблема?или знает, что я здесь не так делаю?
Спасибо заранее.