Гомография и наложение виртуальных объектов

Ключевые слова: Target, opencv, matplotlib, numpy, BFMatcher, queryIdx, trainIdx, findHomography

В этом уроке разберём как наложить виртуальный объект на таргет.

Понадобятся библиотеки opencv, matplotlib и numpy. Загружаем три картинки. Target — это изображение, которое мы хотим отслеживать. Frame — это фотография нашего таргета. Canvas — это объект, который мы хотим наложить поверх нашего изображения.

В первую очередь нужно построить ключевые точки на таргете и на фотографии. Далее сопоставляем эти точки.

Так как изображение после съемки искажается, оно может иметь некоторые перспективные искажения или, допустим, искажения типа fisheye. Как же при всех этих искажениях понять, как правильно наложить canvas? Как правильно уложить виртуальный объект? Для этого есть специальные методы в python, которые умеют вычислять матрицу камеры и соответствующим образом понимают, как нужно исказить виртуальный объект для того, чтобы он ровно накладывался поверх таргета.

Вспоминая предыдущие уроки, необходимо сгенерировать объект orb и построить ключевые точки и дескрипторы для таргета и для снимка.

Сопоставляем эти точки с помощью BFMatcher алгоритма и получаем объект matches. До этого было рассмотрено, какие методы есть у нашего объекта matches. И одни из этих методов это queryIdx и trainIdx.

QueryIdx — индексы объектов таргета, которые присутствуют на снимке. TrainIdx — это индексы фрейма, которые присутствуют на таргете.

Берем свойство pt из наших дескрипторов.

Далее появляется новый метод — findHomography. Это функция, которая вычисляет ту самую матрицу преобразования, которая искажает наше исходное изображение. Внутрь нее передаются дескрипторы оригинального изображения и дескрипторы фрейма. Третий параметр — алгоритм RANSAC, который позволяет вычислять итерационно матрицу камеры.

Следующий метод — warpPerspective. Это метод, который позволяет передать те искажения, которые были в матрице в изображение, которое нужно исправить или исказить. В данном случае, нужно исказить canvas, виртуальный объект, и наложить его поверх снимка.

Для начала попробуем исказить оригинальное изображение, чтобы оно соответствовало наложению и позиции, которая есть на фрейме.

Теперь давайте наложим картинку рыбы поверх изображения. Обратите внимание, что в коде используется resize для нашего виртуального объекта. Сделаем размер рыбы таким, чтобы он соответствовал размеру оригинального таргета.

Теперь сделаем все то же самое, но в видеопотоке. Реализуем функцию zip_img, которая была использована в предыдущих уроках.

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

Теперь необходимо написать сам пайплайн работы и отслеживание изображения в видеопотоке. С помощью VideoCapture инициализируем открытие видеопотока. Ret, frame — это две переменных, которые будут выходить из метода vid. В frame получаем снимок с видеокамеры. Ret говорит, насколько удачно все получилось сделать. Иногда доступ к камере отсутствует, поэтому к ней невозможно обратиться.

Вычислим ключевые точки-дескрипторы с камеры, с помощью метода BFMatcher поставляем ключевые точки и дескрипторы оригинального изображения, и того, что есть в камере. Далее необходимо сопоставить эти точки между собой. Построить findHomography и наложить виртуальное изображение на снимок.

Дополнительные источники информации:

Задание: При запуске программы заметны шумы, видео неровное и неплавное. Для тех, кто хочет разобраться подробнее, рекомендуется модифицировать данный алгоритм.

Last updated