Задачи с перспективной гомографией

Я пытаюсь исправить изображение, используя перспективную деформацию в OpenCV и Python. Я знаю ориентацию камеры (углы X, Y, Z) относительно плоскости, которую нужно деформировать. Я знаю, что самый простой способ — вычислить матрицу гомографии на основе известных точек, однако я пытаюсь сделать то же самое, когда эта информация недоступна. Код, с которым я работаю, создает матрицу вращения, а затем объединяет трансляционную и внутреннюю матрицы. В настоящее время код работает только с манипуляциями по оси Z. Любые манипуляции с осями x и y приводят к странным искажениям изображения. Я основываю свой код на ответе внизу следующего сообщения: Искажение перспективы в OpenCV на основе известной ориентации камеры

Прилагается исходное изображение и деформированное изображение, полученное стандартным методом гомографии.

Исходное изображениеПерспективная деформация

from numpy import *
import cv

x = float(0)
y = float(5)
z = float(0)
f = 1

im = cv.LoadImage("Homography_test.jpg")
cv.NamedWindow("Distorted")
cv.NamedWindow("undistorted")

h, w = cv.GetSize(im)

x1 = x * (pi / 180)
y1 = y * (pi / 180)
z1 = z * (pi / 180)

# Create a rotation matrix
R_array = array([[x1], [y1], [z1]])
R_Vec = cv.fromarray(R_array)
R = cv.CreateMat(3, 3, cv.CV_64FC1)

cv.Rodrigues2(R_Vec, R)

#Create and combine with translation matrix
Trans_Mat = array([[[1], [0], [-w/2]],
                    [[0], [1], [-h/2]],
                    [[0], [0], [1]]])

Trans_Mat2 = cv.fromarray(Trans_Mat)
R_T_Mat = dot(R, Trans_Mat2)

#Create and combine with camera matrix
Intrinsic_Mat = array([[[f], [0], [w/2]],
                       [[0], [f], [h/2]],
                       [[0], [0], [1]]])

Int_Mat = cv.fromarray(Intrinsic_Mat)
H = dot(Int_Mat, R_T_Mat)
H2 = cv.fromarray(H)

persp = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 3)
cv.WarpPerspective(im, persp, H2)

cv.ShowImage("Distorted", im)
cv.ShowImage("undistorted", persp)

cv.WaitKey(0)
cv.DestroyWindow("Distorted")
cv.DestroyWindow("undistorted")

person eminentCodfish    schedule 17.01.2013    source источник


Ответы (1)


вы, кажется, пропустили шаг 4 из моего решения, которое заключалось в том, чтобы «переместить изображение вниз по оси z», линия, которую я использовал для этого.

//4
trans(2,2) += image.rows;

Я выбрал image.rows произвольно, это дало хорошее ощущение масштаба вращения, которое я использовал в примере. Поскольку вы не делаете этого, ваша координата z зафиксирована на 1. Я полагаю, что это является причиной искажения при вращении вокруг x и y, по сути, поскольку изображение находится так близко к камере, когда оно вращается вокруг x или y искажение перспективы сильное. Чем больше сдвиг по оси Z, тем меньше должно появиться искажение. Если вы не хотите, чтобы изображение уменьшалось при перемещении по оси Z, просто увеличьте фокусное расстояние. Вы могли заметить, что в моем примере я установил фокусное расстояние как image.rows.

person Hammer    schedule 17.01.2013
comment
Спасибо Хаммер. Перемещение изображения по оси Z работало немного, но регулировка фокусного расстояния работала лучше. - person eminentCodfish; 22.01.2013