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)はゼロに等しくならないため、コストを定義する便利な方法は です|n.(y - p)|^2yこれは、平面から点までの距離の 2 乗です 。

n重みが等しい場合、ポイントを合計するときに総二乗誤差を最小化するを見つけます。

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

これは、平面上にある点がわかっていることを前提としています。p重心として簡単に計算できます。これは、点群内の点の成分ごとの平均であり、常に最小二乗平面にあります。

解決

M各行がithポイントx_iからセントロイドを引いたものである行列を定義しましょう。次のcように書き直すことができます。

f(n) = | M n |^2

この行列乗算バージョンが前の方程式の合計と同じであることを確信できるはずです。

次に、の特異値分解を行うことができます。必要な は、最小の特異値に対応するの右特異ベクトルによって与えられます。MnM

w_iウェイトを組み込むには、各ポイントのウェイトを定義するだけです。cポイントの加重平均として計算し、同様に、および行列に変更sum_i | n.(x_i - c) |^2します。その後、元のように解決します。sum_i | w_i * n.(x_i - c) |^2M

于 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

最小二乗誤差計算の再定義から始めます。この式は、誤差の二乗和を最小化しようとします。二乗誤差に、距離とともに減少する 2 つの点の関数を掛けます。次に、二乗誤差の加重和を最小化し、そこから係数を導き出します。

于 2012-02-11T20:20:29.573 に答える