Примеры гомографии с использованием OpenCV

Мифическая сказка из Библии рассказывает о первой для людей инженерной катастрофе — Вавилонская башня. У проекта было всё: ясная миссия, огромный человеческий ресурс, отсутствие временных ограничений и адекватные технологии (кирпичи и строительный раствор). Тем не менее, всё это эффектно провалилось, потому что Бог перепутал языки и люди больше не смогли общаться.

Такие термины, как «гомография», сбивают с толку и напоминают, как мы всё еще частенько боремся с общением. Гомография — такая простая концепция, но так странно называется!

Что есть гомография?

Рассмотрим два изображения на плоскости (обложка книги), показанные на рисунке 1. Красная точка представляет одну и ту же физическую точку на двух изображениях. В жаргоне компьютерного зрения они называются corresponding points (точки соответствия). На рисунке 1. показаны четыре точки соответствия в четырех разных цветах — красный, зеленый, желтый и оранжевый. Гомография — это преобразование (матрица 3 × 3), которое отображает точки одного изображения в точки соответствия другого изображения.

Рисунок 1: Два изображения трехмерной плоскости (обложки книги) связаны с помощью гомографии
Рисунок 1: Два изображения трехмерной плоскости (обложки книги) гомографически связаны

Теперь, поскольку гомография является матрицей 3 × 3, мы можем записать ее как

\mathbf{H} = \begin{pmatrix}h_{00}&h_{01}&h_{02}\\h_{10}&h_{11}&h_{12}\\h_{20}&h_{21}&h_{22}\end{pmatrix}

Рассмотрим первый набор соответствующих точек — (x_1, y_1) в первом изображении и (x_2, y_2) во втором. Далее гомография H отображает их следующим образом:

\begin{pmatrix}x_1\\y_1\\1\end{pmatrix} = \mathbf{H} \times \begin{pmatrix}x_2\\y_2\\1\end{pmatrix} = \begin{pmatrix}h_{00}&h_{01}&h_{02}\\h_{10}&h_{11}&h_{12}\\h_{20}&h_{21}&h_{22}\end{pmatrix} \times \begin{pmatrix}x_2\\y_2\\1\end{pmatrix}

Трансформация изображения с помощью гомографии

Приведенное выше уравнение верно для ВСЕХ наборов соответствующих точек, если в реальном мире они лежат на одной плоскости. Другими словами, применив гомографию к первому изображению, сделаете книгу на втором изображении такой же, как на первом! Смотрите рисунок 2.

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

Но как насчет точек, которые не находятся в плоскости? Ну, они НЕ будут выровнены с помощью гомографии, как вы можете видеть на рисунке 2. Но подождите, а что, если на изображении две плоскости? Ну, тогда у вас есть две гомографии — по одной на каждую плоскость.

Панорама есть приложение гомографии

В предыдущем разделе вы узнали, что при известной гомографией между двумя изображениями, можно трансформировать одно изображение в другое. Однако, есть одна тонкость. На изображении должна быть плоскость (обложка книги) и только фрагмент на плоскости может быть правильно трансформирован. Оказывается, если сделаеть снимок любой сцены (и не только плоской), а затем сделаете второй снимок, повернув камеру, то эти два изображения будут связаны гомографией! Другими словами, вы можете установить камеру на штатив и сделать снимок. Затем горизонтально сместить камеру и сделайте еще один снимок. Два изображения совершенно произвольной трехмерной сцены, которые вы только что сделали, будут связаны гомографией. На этих двух изображениях будут некоторые общие фрагменты, которые могут быть выровнены и сшиты так, что получится панорама из двух изображений. Что всё так просто? Нет! (извините, что разочаровал) На создание хорошей панорамы уходит много времени, но основной принцип заключается в том, чтобы с использованием гомографии выравнивать и сшивать так, чтобы швов было не видно. Созданию панорамы, безусловно, будет посвящена одна из следующих статей.

Как рассчитать гомографию?

Чтобы рассчитать гомографию между двумя изображениями, нужно знать как минимум 4 точки соответствия между двумя изображениями. Если таких точек больше, то это даже лучше. OpenCV надежно проведёт оценку гомографии по всем точкам соответствия самым наилучшим образом. Обычно эти точки соответствия обнаруживаются автоматически путем сопоставления между изображениями таких функций, как SIFT или SURF, но здесь точки заданы вручную.

Посмотрим код.

'''
pts_src и pts_dst - это массивы точек
в исходных и конечных изображениях. Нам нужно как минимум
4 соответствующих пункта. 
'''
h, status = cv2.findHomography(pts_src, pts_dst)

''' 
Рассчитанная гомография может быть использована для деформации
исходного изображения до места назначения. Размер
размер (ширина, высота) im_dst
'''

im_dst = cv2.warpPerspective(im_src, h, size)

Пример гомографии с OpenCV на Python

Изображения на рисунке 2 созданы с использованием следующего кода Python, где используются четыре точки соответствия на двух изображениях и одно изображение трансформируется в другое.

import cv2
import numpy as np

if __name__ == '__main__' :

    # Прочитайте исходное изображение.
    im_src = cv2.imread('book2.jpg')
    # Четыре точки соответствия на обложке книги в исходном изображении
    pts_src = np.array([ [141, 131], [480, 159], [493, 630],[64, 601] ])


    # Прочитайте изображение для трансформации
    im_dst = cv2.imread('book1.jpg')
    # Четыре точки соответствия на обложке книги в изображении трансформации
    pts_dst = np.array([ [318, 256],[534, 372],[316, 670],[73, 473] ])

    # Рассчитайте гомографию
    h, status = cv2.findHomography(pts_src, pts_dst)
    
    # Трансформируем исходное изображение, используя полученную гомографию
    im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))
    
    # Покажите картинки
    cv2.imshow("Source Image", im_src)
    cv2.imshow("Destination Image", im_dst)
    cv2.imshow("Warped Source Image", im_out)

    cv2.waitKey(0)

Приложения гомографии

Самым интересным применением гомографии, несомненно, является создание панорам, например, мозаика и сшивание изображений. О панорамах по-позже. Посмотрим на некоторые другие интересные приложения.

Коррекция перспективы с помощью гомографии

Рисунок  3. Коррекция перспективы
Рисунок 3. Коррекция перспективы

Допустим, у вас есть фотография, показанная на рисунке 1. Не было бы здорово, если бы вы могли щелкнуть по четырем углам книги и быстро получить изображение, похожее на изображение, показанное на рисунке 3. Вы можете получить код для этого пример в разделе загрузки ниже. Вот шаги.

  1. Напишите пользовательский интерфейс для сбора четырех углов книги. Давайте подсчитаем эти баллы pts_src
  2. Нам нужно знать соотношение сторон книги. Для этой книги соотношение сторон (ширина/высота) составляет 3/4. Таким образом, мы можем выбрать размер выходного изображения 300 × 400, а наши конечные точки (pts_dst) равны (0,0), (299,0), (299,399) и (0,399)
  3. Получите гомографию, используя pts_src и pts_dst.
  4. Примените гомографию к исходному изображению, чтобы получить изображение на рисунке 3.

Виртуальный билборд

На многих телевизионных спортивных мероприятиях реклама практически вставляется в прямую трансляцию видео. Например. в футболе и бейсболе реклама, размещенная на небольших рекламных щитах прямо за границей поля, может быть практически изменена. Вместо того, чтобы показывать одно и то же объявление всем, рекламодатели могут выбирать, какие объявления показывать, исходя из демографических данных, местоположения и т. Д. В этих приложениях в ролике обнаруживаются четыре угла рекламного щита, которые служат точками назначения. Четыре угла объявления служат исходными точками. Гомография рассчитывается на основе этих четырех соответствующих точек и используется для деформации рекламы в видеокадр.

Прочитав этот пост, вы, вероятно, получите представление о том, как разместить изображение на виртуальном рекламном щите. Рисунок 4. показывает Исходное изображение, загруженное из интернета.

Рисунок 4. Исходное изображение, загруженное из интернета
Рисунок 4. Исходное изображение, загруженное из интернета

А на рисунке 5 показан Таймс-сквер.

Рисунок 5. Таймс-сквер
Рисунок 5. Таймс-сквер

Мы можем заменить один из рекламных щитов на Таймс-сквер нужным нам изображением. Вот шаги.

  1. Напишите пользовательский интерфейс для сбора четырех углов рекламного щита на изображении. Давайте назовем эти точки pts_dst
  2. Пусть размер изображения, которое вы хотите поместить на виртуальный рекламный щит, будет равен w x h. Поэтому углы изображения (pts_src) должны быть (0,0), (w-1,0), (w-1, h-1) и (0, h-1)
  3. Получите гомографию, используя pts_src и pts_dst.
  4. Примените гомографию к исходному изображению и смешайте его с целевым изображением, чтобы получить изображение на рисунке 6.

Обратите внимание на рисунок 6, где в изображение на Таймс-сквер мы вставили изображение, показанное на рисунке 4.

Рисунок 6. Виртуальный рекламный щит. Один из рекламных щитов на левой стороне был заменен нужным нам изображением
Рисунок 6. Виртуальный рекламный щит. Один из рекламных щитов на левой стороне был заменен нужным нам изображением

Кредиты изображений

  1. Изображение на рисунке 4. было первым фотографическим изображением, загруженным в Интернет. Это квалифицируется как добросовестное использование. [ link ]
  2. Изображение, использованное на рисунке 5. (Квадрат времени), лицензировано в рамках GFDL. [ ссылка ]

По мотивам Homography Examples using OpenCV ( Python / C ++ )

CC BY-NC 4.0 Примеры гомографии с использованием OpenCV, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.


Респект и уважуха

Добавить комментарий