Zhe*_*den 1 matlab transformation similarity affinetransform rotational-matrices
如何计算3D中4点之间的MatLab相似度变换?我可以从中计算变换矩阵
T*X = Xp,
但由于点坐标误差很小,它会给我仿射矩阵.我怎样才能将该矩阵与相似矩阵相匹配?我需要类似的东西fitgeotrans,但需要3D
谢谢
如果我正确地解释您的问题,您将寻找在3D变换矩阵中找到最佳扭曲一个点到另一个点的所有系数.你真正需要做的就是把这个问题放到线性系统中解决.回想一下,在3D中将一个点翘曲到另一个点只是:
A*s = t
Run Code Online (Sandbox Code Playgroud)
s = (x,y,z)是源点,t = (x',y',z')是目标点,A将是3 x 3转换矩阵,其格式为:
A = [a00 a01 a02]
[a10 a11 a12]
[a20 a21 a22]
Run Code Online (Sandbox Code Playgroud)
写出实际的方程组A*s = t,我们得到:
a00*x + a01*y + a02*z = x'
a10*x + a11*y + a12*z = y'
a20*x + a21*y + a22*z = z'
Run Code Online (Sandbox Code Playgroud)
系数A是我们需要解决的问题.以矩阵形式重写,我们得到:
[x y z 0 0 0 0 0 0] [a00] [x']
[0 0 0 x y z 0 0 0] * [a01] = [y']
[0 0 0 0 0 0 x y z] [a02] [z']
[a10]
[a11]
[a12]
[a20]
[a21]
[a22]
Run Code Online (Sandbox Code Playgroud)
假设您有四个点,则只需连接左侧矩阵的行和右侧的向量
[x1 y1 z1 0 0 0 0 0 0] [a00] [x1']
[0 0 0 x1 y1 z1 0 0 0] [a01] [y1']
[0 0 0 0 0 0 x1 y1 z1] [a02] [z1']
[x2 y2 z2 0 0 0 0 0 0] [a10] [x2']
[0 0 0 x2 y2 z2 0 0 0] [a11] [y2']
[0 0 0 0 0 0 x2 y2 z2] [a12] [z2']
[x3 y3 z3 0 0 0 0 0 0] * [a20] = [x3']
[0 0 0 x3 y3 z3 0 0 0] [a21] [y3']
[0 0 0 0 0 0 x3 y3 z3] [a22] [z3']
[x4 y4 z4 0 0 0 0 0 0] [x4']
[0 0 0 x4 y4 z4 0 0 0] [y4']
[0 0 0 0 0 0 x4 y4 z4] [z4']
S * a = T
Run Code Online (Sandbox Code Playgroud)
S现在将是一个包含上述格式的四个源点的矩阵,现在是您想要求解的矩阵中的变换系数a的向量(以行 - 主格式排序),并且T将是目标点的向量.上面显示的格式.
要求解参数,您只需使用mldivide运算符或\MATLAB,它将为您计算最小二乘估计.因此:
a = S^{-1} * T
Run Code Online (Sandbox Code Playgroud)
因此,只需像上面那样构建矩阵,然后使用\运算符来求解矩阵中的变换参数.完成后,重塑T为3 x 3矩阵.因此:
S = ... ; %// Enter in your source points here like above
T = ... ; %// Enter in your target points in a right hand side vector like above
a = S \ T;
similarity_matrix = reshape(a, 3, 3).';
Run Code Online (Sandbox Code Playgroud)
关于每个坐标的小扰动中的误差,你得到的点越多越好.使用4肯定会给你一个解决方案,但在我看来,这还不足以减轻任何错误.
次要注意:这个(或多或少)是fitgeotrans引擎盖下的内容.它在给定一堆源点和目标点的情况下计算出最佳单应性,并使用最小二乘法确定这一点.
希望这能回答你的问题!