SfMやSLAMでは、2次元点と3次元点の対応付けから、カメラパラメータ(透視投影変換行列)を求める必要があります。今回は、DLT (Direct Linear Transformation)を使った透視投影変換行列の導出法について書いてみます。
DLTの考え方はこの本に書いてあります(英語です)。
やりたいこと
ある画像の特徴点の2次元座標と、その特徴点の世界座標(3次元座標)がわかっているものとします。このとき、この世界座標点は透視投影変換を経て画像上に投影されているはずです。
この透視投影変換行列を導出したいのです。

透視投影変換とはそもそも何者かわからない人は、こちらを参照ください。
DLTを使った透視投影変換行列の導出
さて、上の透視投影変換の式を展開するとこのようになります。

さらに、この式を\(u,v\)についてまとめると、このように\(s\)を削除した形式にできます。

ここで、\(\boldsymbol{A,x}\)を次のように置いてみます。

すると、(1)の式は

という風に書き換えることができます。実際に式を展開してまとめると(1)と同じになるので、不安な人は試してみてください。
2次元点、3次元点の対応付けが複数わかっていれば、行列\(\boldsymbol{A}\)はこう書くことができるので、

先ほどの式はこうなります。

あとは、特異値分解とかを使ってこれを解いて\(\boldsymbol{x}\)を求めてやれば、透視投影変換行列を求めることができます。
なお、透視投影変換行列の自由度は12で、2次元点と3次元点の対応付け1つで2つの方程式を作ることができるので、透視投影変換行列をこの方法で導出するには、最低6つの2次元点、3次元点の対応付けが既知である必要があります。
コメント