5

我正在使用最小二乘法将平面拟合到 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];
}

比制作​​矩阵:

double[][] A = {
    {fSumXX, fSumXY, fSumX},
    {fSumXY, fSumYY, fSumY},
    {fSumX,  fSumY,  pointCloud.size()}
};

double[][] B =  {
    {fSumXZ},
    {fSumYZ},
    {fSumZ}
};

比解决 Ax = B 和解决方案的 3 个分量是拟合平原的系数...

那么,您能帮我修改一下如何使用权重吗?谢谢!

4

3 回答 3

9

直觉

x由法线定义的平面上的点和平n面上的点p服从:n.(x - p) = 0。如果一个点y不在平面上,n.(y -p)将不等于 0,因此定义成本的有用方法是 by |n.(y - p)|^2。这是点 y到平面的平方距离。

在权重相等的情况下,您希望找到n在对点求和时最小化总平方误差的 :

f(n) = sum_i | n.(x_i - p) |^2

现在假设我们知道平面上的某个p。我们可以很容易地将一个计算为质心,它只是点云中点的分量平均值,并且总是位于最小二乘平面中。

解决方案

让我们定义一个矩阵M,其中每一行都是ithx_i减去质心c,我们可以重写:

f(n) = | M n |^2

您应该能够说服自己,这个矩阵乘法版本与前面等式的总和相同。

然后,您可以对 进行奇异值分解M然后由与最小奇异值相对应n的右奇异向量给出您想要的。M

要合并权重,您只需w_i为每个点定义一个权重。计算c为点的加权平均值,并以类似的方式更改sum_i | n.(x_i - c) |^2sum_i | w_i * n.(x_i - c) |^2和矩阵。M然后像以前一样解决。

于 2012-02-11T20:28:25.520 回答
3

将每个总和中的每个项乘以相应的权重。例如:

fSumZ += weight * pos[2];
fSumXX += weight * pos[0]*pos[0];

由于pointCloude.size()1所有点的总和,因此应将其替换为所有权重的总和。

于 2012-02-11T20:18:12.173 回答
1

从重新定义最小二乘误差计算开始。该公式试图最小化误差平方和。将平方误差乘以随距离减小的两点的函数。然后尝试最小化平方误差的加权和并从中得出系数。

于 2012-02-11T20:20:29.573 回答