正如您的参考文献所示,表示一般投影变换的标准方法是增强您的(x,y)
二维坐标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
and 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
and 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*
)。使用线性代数库来求解系统并获得结果(假设您不想编写自己的求解器......)。