【发布时间】:2016-06-19 13:13:52
【问题描述】:
我有 4 个 2D 点的坐标,它们形成一个矩形,以及在应用透视变换后它们的坐标。
透视变换在齐次坐标中计算并由 3x3 矩阵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/A 或M = (A'\B')' 在MATLAB 中求解M。
但这并不容易。我知道变换后点的坐标,但我不知道确切的B,因为有因子w,在齐次变换后不需要1。因为在齐次坐标中,向量的每个倍数都是同一个点,我不知道我会得到哪个倍数。
考虑到这些未知因素,我将等式写为M*A=B*W
其中W 是一个对角矩阵,其对角线上B 中的每个点的因子为 w1...w4。所以A 和B 现在已经完全知道了,我必须为M 和W 求解这个方程。
如果我可以将方程重新排列为x*A=B 或A*x=B 的形式,其中x 将类似于M*W,我可以解决它并且知道M*W 的解决方案可能已经足够了。然而,尽管尝试了所有可能的重新排列,但我没有成功。直到我意识到封装 (M*W) 是不可能的,因为一个是 3x3 矩阵,另一个是 4x4 矩阵。我在这里卡住了。
另外,M*A=B*W 没有针对M 的单一解,因为M 的每个倍数都是相同的转换。把它写成一个线性方程组,可以简单地修复M 的一个条目来获得一个单一的解决方案。此外,可能有一些输入根本无法解决M,但我们暂时不用担心。
我实际上想要实现的是某种矢量图形编辑程序,用户可以在其中拖动形状边界框的角来对其进行变换,同时在内部计算变换矩阵。
实际上我在 JavaScript 中需要这个,但如果我什至不能在 MATLAB 中解决这个问题,我就会完全陷入困境。
【问题讨论】:
标签: matlab matrix transform linear-algebra