Как указывает ваша справка, стандартный способ представления общего проективного преобразования состоит в увеличении ваших (x,y)
2-D координат с помощью координаты w
(для получения однородных координат [x,y,w]
),и использовать матрицу 3x3 для их преобразования.
Из вашего вопроса неясно, как именно вы сейчас пытаетесь использовать свои точки, но я подозреваю, что существует некоторая путаница с тем, как использовать дополнительную координату.С математической точки зрения следует помнить, что вы можете умножить весь однородный вектор на произвольный ненулевой коэффициент масштабирования (поскольку в конце деление на третью координату приведет к уменьшению коэффициента масштабирования).Однако иногда трудно понять, что это означает в практическом смысле ...
Для этой задачи настройте систему следующим образом (здесь я рассматриваю однородные координаты как векторы строк, чтобы соответствовать вашей ссылке):
Find a 3x3 matrix T, such that:
it maps each point b to corresponding point a: a = b T
specifically:
w' * [a_x a_y 1] = w * [b_x b_y 1] * [ T_xx T_xy T_xw ]
[ T_yx T_yy T_yw ]
[ T_wx T_wy T_ww ]
Хитрый бит: вы не можете просто установить w
и w'
в 1. Это потому, что проективное преобразование T
не обязательно оставляет третийкоордината без изменений !(Если это так, вы могли бы вообще пропустить однородный бит и получить аффинное преобразование, используя только три пары точек ...).
Один из способов выразить это (таким образом, который может быть легко решен) -чтобы добавить параметр, K = w' / w
.Затем вы можете выразить вышеизложенное как линейную систему следующим образом:
for each point b and corresponding point a,
[a_x a_y 1] * K = [b_x b_y 1] * [ T_xx T_xy T_xw ]
[ T_yx T_yy T_yw ]
[ T_wx T_wy T_ww ]
Помните, что все значения a
и b
являются фиксированными константами ;вы пытаетесь найти для девяти элементов вашей T
матрицы.Каждая пара точек добавляет три ограничения (из приведенного выше равенства векторов) и один дополнительный параметр (K для этого уравнения), что в сумме дает 4 * 3 = 12 ограничений и 9 + 4 = 13 параметров.Итак, здесь мы пропускаем одно ограничение ...
Требуется дополнительное ограничение, потому что матрица T
эффективно имеет произвольный коэффициент масштабирования: это отображение между однородными координатами (которые все делят произвольное масштабированиефактор в любом случае), так что нет никакого способа решить, что это за коэффициент масштабирования.Один из способов исправить этот коэффициент - произвольно установить T_ww = 1
:
for each point pair (a, b):
[a_x a_y 1] * K = [b_x b_y 1] * [ T_xx T_xy T_xw ]
[ T_yx T_yy T_yw ]
[ T_wx T_wy 1 ]
Это дает вам полностью определенную линейную систему:
0 = b1_x*T_xx + b1_y*T_yx + 1*T_wx - a1_x*K1
0 = b1_x*T_xy + b1_y*T_yy + 1*T_wy - a1_y*K1
-1*1 = b1_x*T_xw + b1_y*T_yw - 1*K1
0 = b2_x*T_xx + b2_y*T_yx + 1*T_wx - a2_x*K2
0 = b2_x*T_xy + b2_y*T_yy + 1*T_wy - a2_y*K2
-1*1 = b2_x*T_xw + b2_y*T_yw - 1*K2
0 = b3_x*T_xx + b3_y*T_yx + 1*T_wx - a3_x*K3
0 = b3_x*T_xy + b3_y*T_yy + 1*T_wy - a3_y*K3
-1*1 = b3_x*T_xw + b3_y*T_yw - 1*K3
0 = b4_x*T_xx + b4_y*T_yx + 1*T_wx - a4_x*K4
0 = b4_x*T_xy + b4_y*T_yy + 1*T_wy - a4_y*K4
-1*1 = b4_x*T_xw + b4_y*T_yw - 1*K4
Теперь у вас 12 линейных уравнений в 12переменные (матричные элементы T_**
и дополнительные параметры масштабирования K*
).Используйте библиотеку линейной алгебры для решения системы и получения результатов (при условии, что вам не хочется писать свой собственный решатель ...).