Обнаружение 2D изображения в Open CV

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

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

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

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

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

2 ответа

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

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

Другие вопросы по тегам