画像座標点をカメラ座標点に変換することを考えてみます。
タイトル詐欺で申し訳ないですが、結論から言うと画像座標点をカメラ座標点への変換はできません。できるのはカメラ座標系原点からカメラ座標点方向へのベクトルを計算することだけです。まぁ、2次元から3次元への変換なんて、明らかに奥行きの情報が足りてないから当然ですよね。なので今回は、このベクトル変換方法についてまとめてみます。
画像座標点からカメラ座標ベクトルへの変換
内部パラメータが既知の場合、カメラ座標系原点からカメラ座標点方向を計算できます。これを説明しやすくするためカメラ座標ベクトルと呼ぶことにします。下の図の赤のベクトルのことですね。
このカメラ座標ベクトルの求め方を今回はまとめてみます。
カメラ座標ベクトルとか画像座標点に内部パラメータの逆行列を掛ければいいんでしょ?とか思ってるそこのあなた!!逆行列の計算コストはそれなりに高いです。そんなことしなくてもカメラ座標ベクトルは求められます。この辺の話は、内部パラメータの意味を理解してればわかると思います。内部パラメータの意味を知らない人はまずはこちらを理解しましょう。
それでは、カメラ座標ベクトルの求め方を順を追って説明します。
なお、内部パラメータは例によってこれで表記します。
1. 画像座標系原点を移動させる
まずは考えやすくするため、カメラ座標系のZ軸上に画像座標系原点があると考えます。すなわち、光学中心の\((u,v)\)分画像座標系原点を移動させるので、画像座標系\((u,v)\)は移動後\((u-c_x,v-c_y)\)となります。
2. カメラ座標ベクトルを求める
さて、ここで内部パラメータの意味を思い出してほしいのですが、カメラ座標点を焦点距離\(f\)の位置に集めたものが画像座標系でした。なので、画像座標点の奥行は\(f\)ということになるので、\((u-c_x, v-c_y,f)\)となります。
ですので、カメラ座標ベクトルは\((u-c_x, v-c_y,f)\)となります。
\(f_x\)と\(f_y\)の値が異なる場合は、\((\frac{u-c_x}{f_x},\frac{v-c_y}{f_y},1)\)とした方が考えやすいかもです。
コメント
レンズの歪み係数はどの段階で考慮したらいいのでしょうか?
レンズの歪み係数が既知の場合は、前処理としてあらかじめ画像の歪みを補正しておくのが一般的かと思います。本記事でも歪みはあらかじめ補正済みとして考慮していません。
一番最初の、(u,v)という座標は、補正された画像の座標ということでしょうか?
そうですね。(u, v)は補正された画像座標系として扱っています。