На рисунке ниже цель состоит в том, чтобы вычислить матрицу гомографии H, которая преобразует точки a1 a2 a3 a4 в их аналоги b1 b2 b3 b4. Это:
[b1 b2 b3 b4] = H * [a1 a2 a3 a4]
Какой способ вы бы посоветовали наилучшим образом рассчитать H (3x3). a1 ... b4 - это точки в 2D, которые представлены в однородных системах координат (то есть [a1_x a1_y 1] ', ...). РЕДАКТИРОВАТЬ: для этих типов проблем мы используем SVD, поэтому я хотел бы увидеть, как это можно просто сделать в Matlab.
ИЗМЕНИТЬ:
Вот как я изначально пытался решить эту проблему с помощью svd (H = Q / P) в Maltlab. Cosider следующий код для данного примера
px=[0 1 1 0]; % a square
py=[1 1 0 0];
qx=[18 18 80 80]; % a random quadrangle
qy=[-20 20 60 -60];
if (DEBUG)
fill(px,py,'r');
fill(qx,qy,'r');
end
Q=[qx;qy;ones(size(qx))];
P=[px;py;ones(size(px))];
H=Q/P;
H*P-Q
answer:
-0.0000 0 0 0 0
-20.0000 20.0000 -20.0000 20.0000 0.0000
-0.0000 0 0 0 -0.0000
Я ожидаю, что ответ будет нулевой матрицей, но это не так! ... и поэтому я задал этот вопрос в StackOverflow. Теперь мы все знаем, что это проективное преобразование, не очевидно евклидово. Однако полезно знать, возможно ли в целом вычисление такой матрицы с использованием только 4 точек.
H = B * A' * inv( A * A' )
- person Isaac   schedule 30.07.2012