我正在研究变换矩阵,我想要做的是删除旋转变换并保留缩放,平移等。
我该怎么做?我正在寻求创建一个手动编程的解决方案。
答案 0 :(得分:3)
你需要使用仿射矩阵分解,有几种方法有不同的优点和缺点。你必须要调查它。以下是一些可以帮助您入门的链接:
http://callumhay.blogspot.com/2010/10/decomposing-affine-transforms.html
http://www.itk.org/pipermail/insight-users/2006-August/019025.html
这可能更简单或更复杂,具体取决于转换的性质,我假设它是仿射的。但如果它是线性/刚性的,那么这就容易多了,如果它是一个透视变换,那么我想它会更复杂。
答案 1 :(得分: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)
答案 2 :(得分: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 |
答案 3 :(得分: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]