Матрица гомографии в OpenCV

Я создаю приложение, в котором я найду перспективу изображения с высоты птичьего полета, умножив его на матрицу гомографии. Я много читал об этом, и кажется, что функция умножения матриц — это warpPerspective(). Хотя, когда я это делаю, результирующее изображение представляет собой изображение, в котором все пиксели равны нулю, а только первая строка - нет.

Пожалуйста, дайте мне способ умножить матрицу гомографии на изображение, будь то C ++ или Python.

Вот код, который я использую:

import cv2
import numpy as np

tilt = np.pi * 35 / 180

a = np.zeros((3, 3))

a[0][0] = 1
a[1][1] = np.sin(tilt)
a[1][2] = -np.sin(tilt)
a[2][2] = np.cos(tilt)
a[2][2] = np.cos(tilt)

src = cv2.imread("S2.jpg")
width, height, depth = src.shape

output = cv2.warpPerspective(src, a, (width, height))

cv2.imwrite("results.png", output)

Изображение, к которому я применяю гомографию:

Исходное изображение

Результат использования warpPerspective:

Изображение результата

Видно, что в левом верхнем углу результирующего изображения есть небольшая часть.

Ваша помощь очень ценится!!


person coding4fun    schedule 02.01.2015    source источник
comment
не могли бы вы попробовать a[0][0] = 1 a[0][1] = 0 a[0][2] = 100 a[1][0] = 0 a[1][1] = 0 a [1][2] = 100 а[2][0] = 0 а[2][1] = 0 а[2][2] = 1 вместо этого? ваше изображение должно быть перемещено на 100 пикселей вправо и на 100 пикселей вниз. Если это работает, ваша гомография просто неверна. (кстати, вы установили элемент [2][2] дважды!)   -  person Micka    schedule 02.01.2015
comment
глядя на ваш код, я думаю, вы хотите повернуть камеру вокруг какой-то трехмерной оси? Это не работает для гомографии (поскольку вы хотите повернуть камеру, а не изображение)! Вам нужно 3D-описание сцены и матрицы преобразования 4x4, но это не сделано для warpPerspective и гомографии изображений. Вы должны вычислить гомографию соответствующим методом.   -  person Micka    schedule 02.01.2015
comment
Я пробовал перевод, и он работал. Что касается второго комментария, я фактически реализую работу этого документа (site.uottawa. ca/~laganier/publications/topVI00.pdf), где матрица гомографии приведена на стр. 2, уравнение 6. Если у вас есть какие-либо уравнения или параметры матрицы гомографии, мы будем очень признательны, если вы их предоставите. В противном случае, пожалуйста, направьте меня в том направлении, в котором я должен двигаться.   -  person coding4fun    schedule 02.01.2015
comment
Вы описали самолет, откалибровали камеру и т. д., как указано в статье?   -  person Micka    schedule 02.01.2015
comment
Я не делал этого раньше, спасибо, что указали на это. Однако это не имеет значения. Пожалуйста, предоставьте мне способ реализовать это приложение, даже если это C++. заранее спасибо   -  person coding4fun    schedule 02.01.2015
comment
извините... нет времени и недостаточно опыта, чтобы кодировать это для вас. Просто откалибруйте свою камеру (C matrix in the paper) и дайте некоторое приближение для h и 2 углов и снова проверьте матрицу бумаги (и дайте полную матрицу вашему коду, а не только ее часть, как вы сделали). Если вы можете использовать Matlab, попробуйте сначала там.   -  person Micka    schedule 02.01.2015


Ответы (1)


Я думаю, что это связано с вашей матрицей a, так как вызов вашего кода с помощью

a = np.array([[1, 0, 0],
              [0, 1, 0],
              [0, 0, 1]],
             dtype=np.float32)

работает отлично.

person Arnaud P    schedule 02.01.2015