![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
この記事では、KinectFusionのような深度フュージョンパイプラインで使われるICPアルゴリズムについて説明する。
ICPの目的は、2つの点群、すなわち古い点群(3Dモデル内の既存の点と法線)と新しい点群(新しい点と法線、既存のモデルに統合したいもの)を位置合わせすることである。ICPはこれら2つの点群間の回転+並進変換を返す。
Iterative Closest Point (ICP) は、2つの点群内の対応する点同士の点と平面の距離 (Point to Plane Distance, PPD) である目的関数を最小化する:
具体的には、対応する各点 P と Q について、点 P から、点 Q と点 Q に位置する法線 N によって決まる平面までの距離である。2点 P と Q は、現在のカメラ姿勢の下で同じピクセルに投影される場合に対応していると見なされる。
p - 新しい点群内のi番目の点
q - 古い点群内のi番目の点
n - 古い点群内の点 q における法線
したがって、ppd(...) は(p と q の差)と(n)の内積として表せる:
T(p) は点 p の剛体変換である:
ここで R は回転、t は並進である。
T はICPで求める変換であり、その目的は各点 p を点と平面の距離の観点で対応する点 q に近づけることである。
関数の最小化にはガウス・ニュートン法を用いる。
ガウス・ニュートン法では、R と t を関数Eが減少する方向、すなわちその勾配の方向に変化させながら逐次的にステップを進める:
微小な近傍で近似してみよう。
これが R と t を変化させて最小化しようとする式である:
点と平面の距離は R と t の両方に対して線形だが、回転空間それ自体は線形ではない。これは R がその回転角からどのように生成されるかを見れば分かる:
しかし、微小回転であるため、R は次の形で近似できる:
ここで I は単位行列、A は3次元特殊直交群 so(3) の要素である。
すべての sin(t) 項と cos(t) 項を t --> 0 における極限に近づけると、次の表現が得られる:
R の近似を E の式に代入し直すと、次が得られる:
変換のシフトを近似する関数fを導入しよう:
E_approx は、その微分(すなわち引数の増加による導関数)がゼロのとき最小になる。そこでその微分を求めよう:
ppd を微分しよう:
ベクトルxの全変数x_jについて得られるのは次のとおりである:
新しい変数を置く:
f(x, p) は行列とベクトルの乗算として表せる。それを証明するには、 であることを思い出す必要がある:
G(p) は簡略化のために導入する。
であるため、
が得られる。
新しい値を置く:
置き換えを行う:
この方程式を解くことで、各ガウス・ニュートン反復の剛体変換のシフトが得られる。
シフトから回転行列と並進行列を生成し、現在の姿勢行列に得られた行列を掛ける。
シフトの並進部分はそのまま結果の行列に寄与するが、回転部分の生成はもう少し巧妙である。回転シフトは指数化によって so(3) から SO(3) へ変換される。実際、3×1のrshiftベクトルは回転軸に回転角を掛けたものを表す。これからロドリゲス変換を用いて回転行列を得る。詳細については wikiページ を参照のこと。