2016-03-05 323 views
2

我已经在2D中构建了一个矩形,并且它们的坐标已经应用了透视变换之后的4个点的坐标。从MATLAB中的4个点计算2D齐次透视变换矩阵

enter image description here

透视变换在齐次坐标计算并通过一个3×3矩阵M定义。如果矩阵不知道,我如何从给定的点计算它?

用于一个点的计算是:

| M11 M12 M13 | | P1.x | | w*P1'.x | 
| M21 M22 M23 | * | P1.y | = | w*P1'.y | 
| M31 M32 M33 | | 1 | | w*1  | 

要同时计算所有点我写在一起在一个矩阵A和类似的变换点以矩阵B

| P1.x P2.x P3.x P4.x | 
A = | P1.y P2.y P3.y P4.y | 
    | 1 1 1 1 | 

所以等式为M*A=B,并且这可以通过M = B/AM = (A'\B')'在MATLAB中解决为M

但这并不容易。我知道转换后点的坐标,但我不知道确切的B,因为存在因子w,并且在齐次转换后不需要1。因为在齐次坐标中,矢量的每个倍数都是相同的点,我不知道我会得到多少。

考虑到这些未知因素我写的公式为M*A=B*W 其中W与系数w1对角矩阵... W4为在对角线上的B的每一个点。所以AB现在是完全已知的,我必须解决这个公式为MW

如果我能方程重新进入形式x*A=BA*x=B其中x会像M*W我可以解决这个问题,并知道了M*W的解决办法或许是已经足够。然而,尽管尝试了所有可能的重新安排,但我没有设法做到这一点。直到它碰到我,封装(M*W)将不可能,因为一个是3x3矩阵,另一个是4x4矩阵。在这里,我卡住了。

另外M*A=B*W没有针对M的单一解决方案,因为M的每个倍数都是相同的转换。把它写成一个线性方程组,可以简单地修复M的其中一个条目以获得单个解决方案。此外,可能有输入没有M的解决方案,但我们现在不用担心这一点。

我实际上试图实现的是某种矢量图形编辑程序,用户可以拖动形状的边界框的角来转换它,而在内部计算转换矩阵。

实际上,我需要JavaScript,但如果我甚至无法在MATLAB中解决这个问题,我完全被卡住了。

回答

2

应该是一个简单的问题。那么我如何才能将M*A=B*W变成可解决的形式?这只是矩阵乘法,所以我们可以把它写成一个线性方程组。你知道像:M11*A11 + M12*A21 + M13*A31 = B11*W11 + B12*W21 + B13*W31 + B14*W41。线性方程组的每个系统都可以写成Ax=b的形式,或者避免与我的问题中已经使用的变量混淆:N*x=y。就这样。

根据我的问题的一个例子:我生成具有已知MW一些输入数据:

M = [ 
    1 2 3; 
    4 5 6; 
    7 8 1 
]; 
A = [ 
    0 0 1 1; 
    0 1 0 1; 
    1 1 1 1 
]; 
W = [ 
    4 0 0 0; 
    0 3 0 0; 
    0 0 2 0; 
    0 0 0 1 
]; 
B = M*A*(W^-1); 

然后我忘记MW。意思我现在有13个变量我正在寻求解决。我把M*A=B*W改写成一个线性方程组,并从那里转换成N*x=y的形式。在N每列具有用于一个可变的因素:

N = [ 
    A(1,1) A(2,1) A(3,1)  0  0  0  0  0  0 -B(1,1)  0  0  0; 
     0  0  0 A(1,1) A(2,1) A(3,1)  0  0  0 -B(2,1)  0  0  0; 
     0  0  0  0  0  0 A(1,1) A(2,1) A(3,1) -B(3,1)  0  0  0; 
    A(1,2) A(2,2) A(3,2)  0  0  0  0  0  0  0 -B(1,2)  0  0; 
     0  0  0 A(1,2) A(2,2) A(3,2)  0  0  0  0 -B(2,2)  0  0; 
     0  0  0  0  0  0 A(1,2) A(2,2) A(3,2)  0 -B(3,2)  0  0; 
    A(1,3) A(2,3) A(3,3)  0  0  0  0  0  0  0  0 -B(1,3)  0; 
     0  0  0 A(1,3) A(2,3) A(3,3)  0  0  0  0  0 -B(2,3)  0; 
     0  0  0  0  0  0 A(1,3) A(2,3) A(3,3)  0  0 -B(3,3)  0; 
    A(1,4) A(2,4) A(3,4)  0  0  0  0  0  0  0  0  0 -B(1,4); 
     0  0  0 A(1,4) A(2,4) A(3,4)  0  0  0  0  0  0 -B(2,4); 
     0  0  0  0  0  0 A(1,4) A(2,4) A(3,4)  0  0  0 -B(3,4); 
     0  0  0  0  0  0  0  0  1  0  0  0  0 
]; 

而且y是:

y = [ 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1 ]; 

通知书的最后一行中N其溶液中描述的等式根据y是1。这就是我在我的问题中提到的,您必须修复M的条目之一以获得单一解决方案。 (我们可以做到这一点,因为每M多是相同的变换),并用这个公式我说M33应为1

我们解决这个问题的x

x = N\y 

,并得到:

x = [ 1.00000; 2.00000; 3.00000; 4.00000; 5.00000; 6.00000; 7.00000; 8.00000; 1.00000; 4.00000; 3.00000; 2.00000; 1.00000 ] 

这对于[ M11, M12, M13, M21, M22, M23, M31, M32, M33, w1, w2, w3, w4 ]

当在JavaScript这样做,我可以用解决方案3210库,它具有所需的功能solve来解决Ax = b。