Jaa*_*a-c 5 algorithm math geometry linear-algebra least-squares
我使用最小二乘法将平面拟合到3D点集.我已经有了算法来做到这一点,但我想修改它以使用加权最小二乘法.意思是每个点都有一个重量(重量越大,平面越接近该点).
当前算法(无重量)如下所示:
计算总和:
for(Point3D p3d : pointCloud) {
pos = p3d.getPosition();
fSumX += pos[0];
fSumY += pos[1];
fSumZ += pos[2];
fSumXX += pos[0]*pos[0];
fSumXY += pos[0]*pos[1];
fSumXZ += pos[0]*pos[2];
fSumYY += pos[1]*pos[1];
fSumYZ += pos[1]*pos[2];
}
Run Code Online (Sandbox Code Playgroud)
而不是制作矩阵:
double[][] A = {
{fSumXX, fSumXY, fSumX},
{fSumXY, fSumYY, fSumY},
{fSumX, fSumY, pointCloud.size()}
};
double[][] B = {
{fSumXZ},
{fSumYZ},
{fSumZ}
};
Run Code Online (Sandbox Code Playgroud)
比解Ax = B,解的3个分量是拟合平面的系数...
那么,你能帮助我如何修改它来使用权重吗?谢谢!
直觉
的点x上由正常限定的平面n和上平面上的点p服从:n.(x - p) = 0.如果一个点y不在平面上,n.(y -p)则不会等于零,因此定义成本的有用方法是|n.(y - p)|^2.这是该点y与平面的平方距离 .
在权重相等的情况下,您希望找到一个n在对点进行求和时最小化总平方误差的方法:
f(n) = sum_i | n.(x_i - p) |^2
Run Code Online (Sandbox Code Playgroud)
现在这假设我们知道飞机上的某些点p.我们可以很容易地计算出一个质心,它只是点云中点的分量方式,并且总是位于最小二乘平面中.
解
让我们定义一个矩阵M,其中每一行是减去质心的ith点,我们可以重写:x_ic
f(n) = | M n |^2
Run Code Online (Sandbox Code Playgroud)
您应该能够说服自己这个矩阵乘法版本与前一个等式的总和相同.
然后,您可以采取奇异值分解的M,和n你想,然后由右奇异向量给出的M对应最小奇异值.
要合并权重,您只需w_i为每个点定义权重.计算c为点的加权平均值,并sum_i | n.(x_i - c) |^2以类似的方式更改为sum_i | w_i * n.(x_i - c) |^2矩阵M.然后像以前一样解决.