openCV Android: knnMatcher возвращает только совпадения для 1 дескриптора - PullRequest
1 голос
/ 28 февраля 2012

Я должен реализовать алгоритм обнаружения логотипа для 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 совпадений, которые в данном случае верны.

Я не могу найти ни одного поста, где рассматривается подобная проблема, была ли у кого-нибудь эта проблема?или знает, что я здесь не так делаю?

Спасибо заранее.

1 Ответ

2 голосов
/ 29 февраля 2012

В следующий раз, когда вы столкнетесь с ошибкой в ​​OpenCV, проверьте, если она уже отправлена ​​на Отслеживание ошибок OpenCV и отправьте новую, если она не найдена.Вы столкнулись с ошибкой в ​​JNI-оболочке для соответствия C ++, исправление было только что зафиксировано в стволе OpenCV.Но вы можете сделать это локально в своей копии OpenCV-2.3.1, это всего лишь одна строка кода:

  1. open org.opencv.utils.Converters :: Mat_to_vector_vector_DMatch (Mat m, List>lldm) в проекте библиотеки Android OpenCV-2.3.1 (Converters.java)
  2. переместите строку List<DMatch> ldm = new ArrayList<DMatch>(); на две строки вниз, чтобы сделать ее 1-й строкой цикла for (Mat mi : mats)
  3. перестроитьпроект OpenCV-2.3.1 и ваш собственный в Eclipse
  4. убедитесь, что теперь средство сопоставления возвращает правильные результаты
...