3Dから2Dへの投影

関連

目次

ピンホールカメラモデル

前提

3次元空間\(W\)上の風景をカメラで撮影した際に得られる像\(I\)について考える。
カメラのレンズは仮想的に体積がないものとして扱い、3次元空間上の1点で表すことにする。風景から反射してカメラのレンズを通った光は、レンズから距離\(f\)だけ後方の投影面 (フィルムやイメージセンサーなど) に結像するものとする。(\(f\)を焦点距離と言う)
投影について考えるためのこのような仮定はピンホールカメラモデルと呼ばれる。


ピンホールカメラモデル

レンズの後方に結ばれる像は、元の風景に対して上下左右が反転しているのでそのままでは扱いづらい。
そこで、カメラの前方距離\(1\)の位置に仮想的な投影面を置く。この仮想投影面上に投影した像を、焦点距離\(f\)で縦横に伸縮することで本来の像と同じものが得られるようになる。


仮想の投影面

カメラ座標系

座標系\(W\)のままではカメラと風景の関係を扱いづらいので、カメラ (のレンズ) を中心とした座標系\(C\)を導入する。
座標系\(C\)は回転行列\(R\in SO(3)\)と並進ベクトル\(t\in\mathbb{R}^3\)によって特徴付けられ、座標系\(W\)の点\(P_W\)は座標系\(C\)では

\begin{align*} P_C=RP_W+t \end{align*}

と表されるものとする。


座標系\(W\)から\(C\)への座標変換

投影画像\(I\)の座標を\((x,y)\)で表す。コンピューターグラフィックスにおける慣例に従って、\(x\)軸を右向き・\(y\)軸を下向きに取ることにする。
また、カメラ座標系の\(X_C\)軸・\(Y_C\)軸は投影画像の座標に合わせて、\(x\)軸・\(y\)軸に平行になるように設定する。\(Z_C\)軸はレンズ前方の仮想の投影面の方向を向くように設定する。このとき投影面は\(Z_C=1\)と表すことができるようになる。


カメラ座標系

透視投影

上記のようにカメラ座標系を定義したとき、座標系\(C\)の原点と風景上の点\(P_C\)が結ぶ直線が投影面\(Z_C=1\)と交わる点は、\(P_C\)の\(Z_C\)座標が1となるように各成分に同じ値を掛けて正規化した点に相当する。
したがって、座標系\(C\)の点\(P_C=(X_C,Y_C,Z_C)\) (ただし\(Z_C>0\)) から\(I\)の点\(p=(x,y)\)への座標変換は次のように表される。

\begin{align*} p &= \begin{pmatrix} x \\ y \end{pmatrix} \\ &= \begin{pmatrix} fX_C/Z_C \\ fY_C/Z_C \end{pmatrix} \\ \end{align*}

この段階では、画像の大きさは焦点距離\(f\)によってスケールされているので、ピクセル座標のスケールに修正するために座標を縦横に伸縮する必要がある。(次の式の\(m_x,m_y\)に対応)
加えて、この段階では\(I\)の中心はカメラの真正面の位置に相当するが、実際の画像では画像の左上の点を\((x,y)=(0,0)\)とすることが多いので平行移動を行う。(次の式の\(w/2,h/2\)に対応)

\begin{align*} p &= \begin{pmatrix} x \\ y \end{pmatrix} \\ &= \begin{pmatrix} m_x & 0 \\ 0 & m_y \end{pmatrix}\begin{pmatrix} fX_C/Z_C \\ fY_C/Z_C \end{pmatrix} + \begin{pmatrix} w/2 \\ h/2 \end{pmatrix} \\ \end{align*}

この関係をアフィン変換で表すと、

\begin{align*} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} &= \begin{pmatrix} m_xf & 0 & w/2 \\ 0 & m_yf & h/2 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} X_C/Z_C \\ Y_C/Z_C \\ 1 \end{pmatrix} \\ &=: K\begin{pmatrix} X_C/Z_C \\ Y_C/Z_C \\ 1 \end{pmatrix} \end{align*}

となる。
行列\(K\)はカメラの内部パラメーター行列と呼ばれ、焦点距離・ピクセル座標への変換の他にカメラの光学特性などを含める場合もある。内部パラメーター行列の値は、通常は実際のカメラを用いた計測 (カメラキャリブレーション) によって求められる。

画角と内部パラメーター行列の関係

カメラが風景を写すことのできる最大の角度を画角あるいは視野 (Field of View) と呼ぶ。

実際の投影面の大きさが\((w_f, h_f)\)であるとき、レンズを通過した光が投影面に当たる最大の角度はそれぞれ

\begin{align*} \mathrm{HFOV} = 2\arctan\left(\frac{w_f/2}{f}\right) \\ \mathrm{VFOV} = 2\arctan\left(\frac{h_f/2}{f}\right) \end{align*}

になる。これらの角度はそれぞれ、水平画角, 垂直画角と呼ばれる。

また、斜め方向の最大の角度は

\begin{align*} \mathrm{DFOV} = 2\arctan\left(\frac{\sqrt{(w_f/2)^2+(h_f/2)^2}}{f}\right) \\ \end{align*}

となる。この角度は対角画角と呼ばれる。


画角

画像の大きさが\((w,h)\)で、ピクセル座標へのスケールが縦横で等しいと想定できる場合 (すなわち\(m_x=m_y\)となる場合)、内部パラメーター行列は水平画角HFOVを用いて次のように表すことができる。(VFOVやDFOVを用いても同様に表すことができる)

\begin{align*} K = \begin{pmatrix} \frac{w/2}{\tan(\mathrm{HFOV}/2)} & 0 & w/2 \\ 0 & \frac{w/2}{\tan(\mathrm{HFOV}/2)} & h/2 \\ 0 & 0 & 1 \end{pmatrix} \end{align*}

まとめ

透視投影

3次元空間\(W\)上にカメラが存在し、その姿勢(=位置と方向)は回転行列\(R\in SO(3)\)と並進ベクトル\(t\in\mathbb{R}^3\)によって特徴付けられるものとする。このとき、座標系\(W\)においてカメラより前方にある点\(P_W\)は、次のように変換されて画像上の点\(p=(x,y)\)に投影される。

\begin{align*} P_C = RP_W+t \end{align*}

\begin{align*} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} &= K\begin{pmatrix} X_C/Z_C \\ Y_C/Z_C \\ 1 \end{pmatrix} \end{align*}

ここで、\(K\)はカメラの特性を表す内部パラメーター行列である。

画像の大きさが\((w,h)\)で、ピクセル座標へのスケールが縦横で等しいと想定できる場合、内部パラメーター行列は水平画角HFOVを用いて次のように表すことができる。

\begin{align*} K = \begin{pmatrix} \frac{w/2}{\tan(\mathrm{HFOV}/2)} & 0 & w/2 \\ 0 & \frac{w/2}{\tan(\mathrm{HFOV}/2)} & h/2 \\ 0 & 0 & 1 \end{pmatrix} \end{align*}

ここでは透視投影に限定した説明を行ったが、透視投影以外の投影方式も存在する。

参考