2019年9月7日土曜日

同一視点の2つのカメラ画像間の変換

変換の公式

\[ \left[ \begin{array}{c} u_a\\ 1 \end{array} \right] \propto K_a R_a R_b^{-1} K_b^{-1}\left[ \begin{array}{c} u_b\\ 1 \end{array} \right] \]

記号$\propto$は,両辺が相似(両辺が平行なベクトルもしくはスケール倍)であることを意味するので,実際には右辺を計算して得られたベクトルが$[u',v',w']$だとすると次のようにして$[u,v]$を計算する. \[ u = u'/w',\ \ v = v'/w' \]

応用先

ステレオカメラの画像を平行化する

2つのカメラの内一方を標準ステレオのカメラにすれば,非標準ステレオのカメラから標準への変換が得られる.

カメラ画像を没入型ディスプレイに表示する

HMDや大型のスクリーンにカメラで取得した画像を提示して,カメラの視点で見た風景を再現する場合, そのカメラをカメラ$a$,CG描画に使用する仮想カメラをカメラ$b$として考えると同じ問題になる.

カメラが回転して得られる画像を元の画像から生成する

回転前後のカメラをカメラ$a$およびカメラ$b$とすれば同じ問題になる. 1台のカメラが回転しただけなのでこの場合は内部パラメータは$K_a=K_b$として考える.

透視投影モデルから導出してみる

必要な式は2種類だけ

2つのカメラの透視投影変換は次の通り.

\[ \left[ \begin{array}{c} u_a\\ 1 \end{array} \right] \propto K_a\left[ R_a | t_a \right] \left[ \begin{array}{c} x\\ 1 \end{array} \right] \] \[ \left[ \begin{array}{c} u_b\\ 1 \end{array} \right] \propto K_b\left[ R_b | t_b \right] \left[ \begin{array}{c} x\\ 1 \end{array} \right] \]

2つのカメラが同一視点上にあるというのは.

\[ -R_a^{T}t_a = -R_b^{T}t_b \]

$x$を消して$u_a$から$u_b$の変換にする

\[ K_a^{-1}\left[ \begin{array}{c} u_a\\ 1 \end{array} \right] \propto R_a x + t_a \] \[ K_b^{-1}\left[ \begin{array}{c} u_b\\ 1 \end{array} \right] \propto R_b x + t_b \]

$t$と$R$を左辺に移項する.

\[ R_a^{-1}\left( K_a^{-1}\left[ \begin{array}{c} u_a\\ 1 \end{array} \right] - t_a\right) \propto x \] \[ R_b^{-1}\left( K_b^{-1}\left[ \begin{array}{c} u_b\\ 1 \end{array} \right] - t_b\right) \propto x \]

$x$を消去する.

\[ R_a^{-1}\left( K_a^{-1}\left[ \begin{array}{c} u_a\\ 1 \end{array} \right] - t_a\right) \propto R_b^{-1}\left( K_b^{-1}\left[ \begin{array}{c} u_b\\ 1 \end{array} \right] - t_b\right) \]

移項した変数を順に元に戻していく.

\[ R_a^{-1} K_a^{-1}\left[ \begin{array}{c} u_a\\ 1 \end{array} \right] - R_a^{-1} t_a \propto R_b^{-1} K_b^{-1}\left[ \begin{array}{c} u_b\\ 1 \end{array} \right] - R_b^{-1} t_b \]

$-R_a^{T}t_a = -R_b^{T}t_b$なので

\[ R_a^{-1} K_a^{-1}\left[ \begin{array}{c} u_a\\ 1 \end{array} \right] \propto R_b^{-1} K_b^{-1}\left[ \begin{array}{c} u_b\\ 1 \end{array} \right] \]

移項した変数を順に元に戻す.

\[ \left[ \begin{array}{c} u_a\\ 1 \end{array} \right] \propto K_a R_a R_b^{-1} K_b^{-1}\left[ \begin{array}{c} u_b\\ 1 \end{array} \right] \]