Обнаружение 2D изображения в Open CV
Какой наиболее разумный алгоритм или комбинация алгоритмов следует использовать из OpenCV для решения следующей задачи:
- У меня есть набор небольших 2D изображений. Я хочу обнаружить расположение этих субизображений на увеличенном изображении.
- Изображения обычно имеют размер около 32x32 пикселей, а изображение большего размера - около 400x400.
- Подизображения не всегда квадратные и содержат альфа-канал.
- Опционально - изображение большего размера может быть зернистым, сжатым, повернуто в 3D или иным образом слегка искажено
Я попытался cvMatchTemplate, с очень плохими результатами (трудно сопоставить правильно и большое количество ложных срабатываний, со всеми методами сопоставления). Некоторые проблемы возникают из-за того, что OpenCV не может работать с шаблонами альфа-каналов.
Я пробовал ручной поиск, который, кажется, работает лучше и может включать альфа-канал, но очень медленный.
Спасибо за любую помощь.
2 ответа
- cvMatchTemplate использует тип метрики MSE (SQDIFF/SQDIFF_NORMED) для сопоставления. Этот вид метрики будет штрафовать различные альфа-значения строго (из-за квадрата в уравнении). Вы пробовали нормализованную взаимную корреляцию? Известно, что лучше моделировать линейные изменения интенсивности пикселей.
- Если NCC не выполняет эту работу, вам необходимо преобразовать изображения в пространство, где различия в интенсивности не оказывают большого влияния. например, вычислить изображение прочности кромки (canny, sobel и т. д.) и запустить cvMatchTemplate для этих изображений.
- Учитывая большую разницу в масштабах изображений (~10х). Для определения правильной шкалы соответствия необходимо будет использовать пирамиду изображений. Рекомендуем начать с масштаба (2^1/x: x - правильный масштаб) и распространить оценку вверх по пирамиде.