Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 通过3点关联对齐点云?_Math_3d_Geometry_Points_Vertices - Fatal编程技术网

Math 通过3点关联对齐点云?

Math 通过3点关联对齐点云?,math,3d,geometry,points,vertices,Math,3d,Geometry,Points,Vertices,假设我有3个点云:第一个有3个点{x1,y1,z1},{x2,y2,z2},{x3,y3,z3},第二个点云有与{xx1,yy1,zz1},{xx2,yy2,zz2},{xx3,yy3,zz3}相同的点。。。我假设将第二个点云与第一个点云对齐,我必须将第二个点云的点乘以T[3x3矩阵] 1) 那么如何找到这个变换矩阵(T)?我试着用手解方程,但没能解出来。有什么解决办法吗?因为我很确定我不是第一个遇到这个问题的人 2) 我假设矩阵可能包括倾斜和剪切。有没有办法找到只有7个自由度的矩阵(3平移,3

假设我有3个点云:第一个有3个点{x1,y1,z1},{x2,y2,z2},{x3,y3,z3},第二个点云有与{xx1,yy1,zz1},{xx2,yy2,zz2},{xx3,yy3,zz3}相同的点。。。我假设将第二个点云与第一个点云对齐,我必须将第二个点云的点乘以T[3x3矩阵]

1) 那么如何找到这个变换矩阵(T)?我试着用手解方程,但没能解出来。有什么解决办法吗?因为我很确定我不是第一个遇到这个问题的人


2) 我假设矩阵可能包括倾斜和剪切。有没有办法找到只有7个自由度的矩阵(3平移,3旋转,1标度)?

以单位向量{1,0,0},{0,1,0}和{0,0,1}到{x1,y1,z1},{x2,y2,z2},{x3,y3,z3}为单位的变换矩阵T1是简单的

| x1 x2 x3 | T1 = | y1 y2 y3 | | z1 z2 z3 | |x1x2x3| T1=| y1 y2 y3| |z1 z2 z3| 同样地,将这3个单位向量带到第二组点的变换T2是

| xx1 xx2 xx3 | T2 = | yy1 yy1 yy3 | | zz1 zz2 zz3 | |xx1 xx2 xx3| T2=| yy1 yy1 yy3| |zz1 zz2 zz3| 因此,将前三个点取为后三个点的矩阵由T2*T1-1给出。如果T1是非奇异的,那么这个变换是唯一确定的,所以它没有自由度。如果T1是一个奇异矩阵,那么可能没有解,或者可能有无穷多个解


当你说你想要7个自由度时,这有点滥用术语。在一般情况下,该矩阵由3个旋转自由度、3个缩放自由度和3个剪切自由度组成,总共9个。您可以通过执行以下操作来确定这些参数。Q矩阵给出旋转参数,R矩阵给出缩放参数(沿对角线)和剪切参数(对角线上方)。

Adam Rosenfield的方法是正确的。但作为T2*Inv(T1)的解决方案是错误的。因为在矩阵乘法中A*B!=B*A:因此结果是Inv(T1)*T2

您所说的被称为三维保角变换,或者有时是三维相似变换,因为两个云是相似的。如果两个形状相同,Adam Rosenfields的解决方案是好的。如果存在微小差异,并且您希望获得最佳拟合,最常用的解决方案是使用最小二乘法来最小化残差。维基百科和谷歌在这方面的东西乍一看似乎并不好。关于这一点,我的参考文献是Ghilani&Wolf的,第345页。这也是一本关于矩阵数学应用于空间问题的好书,也是图书馆的一个很好的补充


编辑:Adam的9参数版本的此变换称为

这里是一个计算R中2D仿射变换参数的最小二乘估计的方法。

否,取决于矩阵向量乘法的约定。如果将右边的(列)向量相乘,那么我的公式是正确的。如果你将左边的(行)向量相乘,那么你的向量是正确的,但是你还必须转置T1和T2。你有没有指向Helmert解决方案的代码/库的指针?我所能想到的就是使用它来转换已知转换的实现。