Поиск фиксированных объектов в OpenCV с SURF и FLANN

Установка и использование OpenCV в Windows Linux

Мы уже немного успели поработать с OpenCV. В этот раз займемся установкой дополнительных компонентов и разработаем простое приложение, которое использует некоторые из них. С его помощью мы сможем находить фиксированные объекты на изображениях, используя алгоритмы SURF и FLANN:

Установка дополнительных компонентов OpenCV

Для работы с некоторыми расширенными возможностями OpenCV 3.0+ требуется установка дополнительных компонентов из репозитория opencv_contrib. Если они вам потребовались, то проще всего воспользоваться рекомендуемым методом и пересобрать OpenCV целиком.

Мы уже рассматривали процесс сборки OpenCV для Linux и Windows. Чтобы установить дополнительные компоненты, сначала необходимо клонировать Git-репозиторий opencv_contrib себе на диск. Например, я клонировал его по соседству с клоном репозитория opencv.

Далее сборка «чистого» OpenCV от «расширенного» отличается лишь на Шаге 2 (см. статьи по сборке OpenCV под Linux и Windows). К команде cmake мы добавляем дополнительный параметр:

Например, если вы следовали моим рекомендациям относительно структуры каталогов, то параметр может выглядеть следующим образом:

OpenCV: Пример использования SURF и FLANN

В широком смысле с помощью SURF и FLANN мы можем решить задачу поиска фиксированного изображения (сохраняющего форму и все свои внешние признаки, но не обязательно угол поворота), которое назовем объектом, на другом изображении (назовем сценой). И приложение, которое мы сейчас создадим, потенциально позволит решать ее именно в таком виде, но с некоторыми оговорками, которые зависят от множества факторов. Однако мы не станем вдаваться в теоретические подробности, а просто воспользуемся технологией.

object

Для тестирования приложения в качестве объекта я использовал изображение дорожного знака STOP, хотя вы вполне можете попробовать любые другие объекты.

А в качестве сцены удобно использовать изображение с несколькими дорожными знаками. Ведь нам важно, чтобы искомый объект не просто находился там, где он есть, но и не был обнаружен там, где его никогда не было.

За основу возьмем пример из официальной документации OpenCV. Но сначала подготовим pro-файл. Основная часть, которая нас интересует:

Здесь мы подключаем все необходимые зависимости от OpenCV. Обратите внимание, что вам может потребоваться немного поменять пути к директориям OpenCV, если они у вас отличаются.

Реализация в файле main.cpp:

В целом код не должен вызывать сложностей и местами дополнен комментариями, но еще раз кратко пройдемся по основным шагам:

  1. Запрашиваем пути к двум изображениям: объекту и сцене;
  2. Находим ключевые точки на обоих изображениях с помощью SURF;
  3. Высчитываем дескрипторы для объекта и сцены;
  4. Сопоставляем дескрипторы с помощью алгоритма FLANN для поиска соответствий;
  5. Отбираем только «хорошие», т.е. близкие совпадения;
  6. Находим искомый объект на сцене, выполняя преобразование координат с учетом возможных трехмерных поворотов изображения (но не деформаций);
  7. Рисуем соответствия и найденные границы изображения;
  8. Выводим результаты на экран.

В результате получаем:

object

Понравилась статья? Поделиться с друзьями:
Добавить комментарий