5

我正在研究一个变换矩阵,我想要做的是移除旋转变换并保留缩放、平移等。

我该怎么做呢?我正在寻求创建一个手动编程的解决方案。

4

4 回答 4

3

您需要使用仿射矩阵分解,有几种方法各有利弊。你必须调查一下。这里有一些链接可以帮助您入门:

http://callumhay.blogspot.com/2010/10/decomposing-affine-transforms.html

http://www.itk.org/pipermail/insight-users/2006-August/019025.html

不过,这可能更简单或更复杂,具体取决于您转换的性质,我假设它是仿射的。但是如果它是线性/刚性的,那么这会容易得多,如果是透视变换,那么我想它会更复杂。

于 2012-05-11T06:19:12.743 回答
2

如果您确定您的矩阵是旋转+平移+缩放,那么您可以提取您需要的参数:

rotation = atan2(m12, m11)
scale = sqrt(m11*m11 + m12*m12)
translation = (m31, m32)

编辑

我没有注意到您对 3d 转换感兴趣,在这种情况下,旋转部分是令人讨厌的部分,但如果您只想平移和缩放...

translation = (m41, m42, m43)
scale = sqrt(m11*m11 + m12*m12 + m13*m13)
于 2012-05-11T06:23:12.963 回答
2

4×4 齐次变换矩阵定义为:

| x2 |   | R11*SX R12*SY R13*SZ TX | | x1 |
| y2 | = | R21*SX R22*SY R23*SZ TY | | y1 |
| z2 |   | R31*SX R32*SY R33*SZ TZ | | z1 |
| 1  |   | 0      0      0      1  | |  1 |

其中(SX,SY,SZ)是比例因子,(TX,TY,TZ)是平移因子,Rij是旋转系数。

由于您选择了最后一列,因此获得翻译是微不足道的。要获得缩放,您使用转换是旋转乘以对角缩放 ( A=R*S) 的属性,因此

tr(A)*A = tr(R*S)*(R*S) = tr(S)*tr(R)*R*S = tr(S)*S

转置运算符在哪里tr(A)。计算比例因子

S2 = tr(A)*A

并选择前三个对角项的平方根

SX = sqrt(S2(1,1))
SY = sqrt(S2(2,2))
SZ = sqrt(S2(3,3))

然后将新的转换组装为:

| SX   0   0  TX |
|  0  SY   0  TY |
|  0   0  SZ  TZ |
|  0   0   0   1 |
于 2015-04-14T03:18:00.340 回答
0

到目前为止,我不喜欢任何解决方案。3x4(或 4x4)仿射变换首先应用旋转,然后在目标帧中进行平移。该变换中的最后一个列向量是平移,但在目标帧​​中,而不是在原始帧中!因此,如果我们对变换进行反变换,那么我们可以将最终的列向量作为原始帧中的平移。

这是我的做法(在 numpy 中):

b_to_a = np.linalg.inv(a_to_b)
a_to_b_only_translation = np.eye(4)
a_to_b_only_translation[:,3] = -b_to_a[:,3]
于 2021-06-07T17:25:54.820 回答