Multiple View Geometry in Computer Vision Second Edition4章から。
対応する4つの点を使って、投影変換を表す行列Hの計算します。Direct Linear Transform (DLT) とたいそうな名前がついていますが、点同士の制約から最小二乗法を用いて行列を求めるアルゴリズムです。
入力データ
Gauche-CVで投影変換Hを求めるのデータをそのまま使います。
xi | x'i |
---|---|
(5,5) | (20,15) |
(15,5) | (25,20) |
(15,15) | (25,25) |
(5,15) | (15,20) |
点の数は計算が一番楽な4点を使います。
DLTアルゴリズム
STEP1 それぞれの対応する点について、Ai行列を計算する
投影変換の式(i=1,2,3,4)
この式は外積を使った表現と同じである。
xi, Hxiをこのように表現する。(h^1T の1は添字でTは転置の意味)
Hxiに代入すると
hの表現を変え、Hxi を使って x'i × Hxi = 0 を書き換えると、
Hは等倍しても等価なので最後のrowは削除でき、Aih=0の形にできる。このときのAiはこの式で表現できる。
(x'i, y'i, w'i)は同次座標なのでw'i = 1に取れる。このときx'i, y'iは実際の座標系の値をそのまま使用できる。次にxiも同次座標系(xi, yi, wi)を使って表現し、行列の要素を書き出すと、2x9の行列が求まる。
Aih=0を同じように表現すると、
STEP2 n個の2x9行列を一つの2nx9の行列Aにする。
STEP1で計算したAiをi=1,2,3,4として4つ並べる。
wi=1として、実際のx'i 等の値を代入する。
STEP3 AのSVD (singular value decomposition, 特異値分解) を行う
STEP2で求めたAから、M=AA^T N=A^TAを求める。ここから数値計算ソフト使ってます。
Nの固有値と固有ベクトルを計算する。ここも数値計算ソフトで計算しています。Nの固有値は、大きい順に λ=929719.210541631, 80711.1190674933, 898.252012306525, 342.925445638261, 105.025927146904, 5.46731883242974, 0.91432069525331, 0.0853662562132915, 3.25254551524502E-13 となる。
それぞれの固有値に対応する固有ベクトルを並べるとこうなる。
行列全体はこちら。
一番小さい固有値 3.25254551524502E-13 に対応する固有ベクトルは、上の行列の一番右のcolumnで表されている。
右端のcolumn { 0.0859683627249945 -0.0614059733758339 0.859683627267237 -0.0736871680499479 0.0245623893504672 -0.49124778701298 0.0024562389349873 -0.00245623893503336 0.0491247787008782} が求める行列Hの要素である。
STEP4 SVDの結果からHを決定する。
{ 0.0859683627249945 -0.0614059733758339 0.859683627267237 -0.0736871680499479 0.0245623893504672 -0.49124778701298 0.0024562389349873 -0.00245623893503336 0.0491247787008782} を行列の形式に並び替える。
投影変換を表す行列Hはスカラー倍に対して等価なので、右下の要素が1になるように、 0.0491247787008782の逆数を全要素にかけると、Gauce-CVで求めた結果とほぼ同じになる。
リファレンス
- DLTのアルゴリズムは Multiple View Geometry in Computer Vision Second Editionを参考にしました。
- SVD (singular value decomposition, 特異値分解)に関しては、これなら分かる応用数学教室―最小二乗法からウェーブレットまでに大変わかりやすく説明がありました。以前にこれなら分かる応用数学教室にも書きましたが、この本は本当にお勧めです。
- 行列の計算と数式のTEXへのエクスポートは、株式会社シンプレックスのカルキングを使いました。