Point Cloud(点群)の各点の法線ベクトルを求めたい。Point Cloud Library(PCL)の
チュートリアルに簡単な説明がある。それによると、点群から法線を求める方法には2つある。
- 点群から曲面を求め、その曲面から各点の法線を計算する。
- 点群から直接法線を計算する。
チュートリアルでは後者を取り上げ、その中で最も簡単な方法として以下を紹介している。
- ある点Aを考える。
- 点Aの近傍k個の点を考える。
- 点Aと近傍k個の点を使い、最小自乗法により平面を決定する。
- その平面の法線ベクトルを求める。
そして、この問題は、近傍点群から構成される共分散行列の固有値問題に帰着すると結ばれ、その固有値問題の数式だけが書かれていた。
導出過程が気になります。以下これを導いてみます。
平面上の点

は次式を満たします。

ここで、

は平面の法線ベクトル、

は定数項です。
従って、最小にすべき自乗式は以下のようになります。
=\sum\limits_{i}\;\|\vec{n}^{T}\cdot \vec{p}_{i}-d\|^2)
ここで、

は近傍点群を表します。平面の式には定数倍だけの不定性があります。
これを取り除くため、法線ベクトルの大きさを1に制限します。この条件をLagrangeの未定乗数により最小自乗式に導入します。
=\sum\limits_{i}\;\|\vec{n}^{T}\cdot \vec{p}_{i}-d\|^2-\lambda\left(\|\vec{n}\|^2-1\right))
最初に

で偏微分します。
=0)
変形して

を得ます。ここで、

は近傍点群の重心を表します。これを最初の
)
に代入すると以下を得ます。
=\sum\limits_{i}\;\|\vec{n}^{T}\cdot\left{\vec{p}_{i}-\vec{p}_{a}\right}\|^2-\lambda\left(\|\vec{n}\|^2-1\right))
これを

で偏微分します。
\;\left(\vec{p}_{i}-\vec{p}_{a}\right) = \lambda \vec{n} )
これを変形すると
^{\;} \left(\vec{p}_{i}-\vec{p}_{a}\right)^{T})
となります。近傍点群から構成される共分散行列の固有値問題に帰着しました。
追記
余談:数式は、Google Chart APIを使ってTexで記述しました。ベースラインがずれているのが気になります。
0 件のコメント:
コメントを投稿