透视投影,4分

时间:2012-01-19 11:52:40

标签: math graphics

我正在尝试实施透视投影。例如,我有一个给定大小的正方形和已知角点的坐标(A1 .. A4)。我有一个图像,这个方块显示在某个特定的位置。我知道它的位置和显示的方形B1 .. B4的角的坐标。我想找到一个转换矩阵M. 翻译B - > A.

我遵循方法Mathematical Illustrations,第10章,我设法很好地改变了3个角落。但是我找不到矩阵来正确转换4个角...我发现矩阵如第7页所示,但它并没有很好地转换所有4个点。

2 个答案:

答案 0 :(得分:4)

如您的参考所示,表示一般投影变换的标准方法是使用(x,y)坐标增加w 2-D坐标(以获得齐次坐标 [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 ]

棘手的一点:您不能只将ww'设置为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 ]

请注意,所有ab值都是固定常量;你正在尝试解决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个变量(矩阵元素T_**和其他缩放参数K*)中有12个线性方程。使用线性代数库来解决系统并获得结果(假设您不想编写自己的求解器......)。

答案 1 :(得分:3)