2012-02-11 29 views
5

最小二乗法を用いて3Dポイントセットに平面を当てはめています。私はすでにそれを行うアルゴリズムを持っていますが、重み付き最小二乗法を使用するように修正したいと思います。意味私は各点の重量を持っています(体重が大きいほど、飛行機はその点に近づくはずです)。加重最小二乗 - 平面を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]; 
} 

:解く方程式Ax = B及び3より

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

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

解の成分はフィットした平面の係数です。

S oこれを変更してウェイトを使用する方法を教えてください。ありがとう!

+4

FYI - 多くのポイント(> 20など)があり、座標に大きなオフセットがある場合は、生の位置の平方和) - 数値誤差に対する感度が低い。少なくとも、X/Y/Z座標の平均値を最初に差し引いてから、処理を行い、最後にオフセットを戻します。これを行うアルゴリズム固有の方法は他にもありますが、アルゴリズムが最小二乗法をどのように使っているかはわかりませんので、それ以上のことはできません。 –

+0

オフセットとはどういう意味ですか? (申し訳ありませんが、この文脈では分かりません)。 –

+2

簡単な例:点p1 =(10001,10002,10003)、p2 =(10005,10006,10007)、p3 =(10009,10004,10008)。これらの平均値は(10005,10004,10006)です。したがって、ポイント座標をこの量の反対にオフセット(平行移動)して、p1 '=(-4、-2、-3)、p2' =(0,2,1)、p3 '=(4,0、 2)。次に、あなたの数学を行い、その後オフセットに戻します。 –

答えて

10

直観

x。点yが平面上にない場合、n.(y -p)はゼロに等しくないので、コストを定義する便利な方法は|n.(y - p)|^2です。これは、平面から点yの二乗された距離です。等しい重みを持つ

、あなたはポイントの上に合計するとき、合計二乗誤差を最小にnを見つけたい:

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

さて、これは私たちが平面上にある一部ポイントpを知っている前提としています。我々は簡単に重心として計算することができます。重心は、点群の点の構成要素ごとの平均であり、常に最小二乗平面内にあります。

ソリューション

のは、我々は再び書くことができ、各行はithポイントx_iある行列Mマイナス重心cを定義してみましょう:

f(n) = | M n |^2 

あなたがいることを自分自身を納得させることができるはずですこの行列乗算のバージョンは、前の式の合計と同じです。

その後、Msingular value decompositionを取ることができ、あなたが望むnは、その後、最小特異値に対応Mの右特異ベクトルで与えられます。

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

+0

結局のところ、これはうまくいきました。ありがとうございました! –

2

各合計の各項に対応する重みを掛けます。例えば:pointCloude.size()はすべての点について1の和であるので

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

は、それはすべての重みの和に置き換えなければなりません。

+0

私はそれが各用語に体重を乗じるのに十分であるべきだと思ったが、私は確信が持てなかった...私はそれを試して戻ってくるだろう。ありがとう。 –

0

最小二乗誤差計算を再定義することから始めます。数式は誤差の二乗の和を最小にしようとします。距離の減少に伴い減少する2点の関数で2乗誤差を掛けます。次に、重み付けされた誤差の和を最小にし、それから係数を導き出します。 n.(x - p) = 0n正常および平面p従う上の点によって規定される平面上の

関連する問題