Обнаружение 2D изображения в Open CV - PullRequest
8 голосов
/ 31 декабря 2010

Какой наиболее разумный алгоритм или комбинация алгоритмов использовать из OpenCV для решения следующей задачи:

  • У меня есть набор небольших 2D-изображений.Я хочу определить расположение этих субизображений на большом изображении.
  • Субъективы обычно составляют около 32x32 пикселей, а увеличенное изображение - около 400x400.
  • Субизображения не всегда квадратные, инапример, содержит альфа-канал.
  • Опционально - изображение большего размера может быть зернистым, сжатым, повернуто в 3D или слегка искажено

Я пробовал cvMatchTemplate, с очень плохими результатами (сложночтобы правильно сопоставить и большое количество ложных срабатываний, со всеми методами сопоставления).Некоторые проблемы возникают из-за того, что OpenCV не может соответствовать шаблону альфа-канала.

Я пробовал ручной поиск, который, кажется, работает лучше и может включать альфа-канал, но оченьмедленно.

Спасибо за любую помощь.

Ответы [ 2 ]

7 голосов
/ 31 декабря 2010
  1. cvMatchTemplate использует тип метрики MSE (SQDIFF / SQDIFF_NORMED) для сопоставления.Этот вид метрики будет штрафовать различные значения альфа строго (из-за квадрата в уравнении).Вы пробовали нормализованную взаимную корреляцию?Известно, что лучше моделировать линейные изменения интенсивности пикселей.
  2. Если NCC не выполняет эту работу, вам необходимо преобразовать изображения в пространство, где различия в интенсивности не оказывают большого влияния.например, вычислить изображение прочности кромки (canny, sobel и т. д.) и запустить cvMatchTemplate для этих изображений.
  3. Учитывая большую разницу в масштабах изображений (~ 10x).Для определения правильной шкалы соответствия необходимо использовать пирамиду изображений.Рекомендуем начать со шкалы (2 ^ 1 / x: x - правильная шкала) и распространить оценку вверх по пирамиде.
2 голосов
/ 01 января 2011

Вам нужно что-то вроде SIFT или SURF.

...