OpenCV – カメラモデルとカメラパラメータについて解説

目次

概要

カメラモデルとは、3 次元空間上の点とカメラで撮影した画像上の点との対応関係を記述するモデルです。

ピンホールカメラモデル

ピンホールカメラモデル (Pinhole Camera Model) は、カメラの動作を表現するための基本的なモデルです。 ピンホールカメラは、レンズを使用せず、光を通す小さな穴 (ピンホール) を持ち、外部の光が入らない密閉した箱から成り立っています。 光はピンホールを通り、箱の反対側の内壁に上下左右反転した実像を形成します。 この像が形成される面を画像平面 (Image Plane) といいます。

ここで、ピンホールの位置に $X$ 軸をカメラの水平方向、$Y$ 軸をカメラの 垂直方向、$Z$ 軸をカメラの前方方向としたカメラ座標系 (Camera Coordiante) を設定します。 また、計算を簡単にするために、カメラの前方に Z 軸に垂直で X 軸に沿った仮想画像平面 (Virtual Image Plane) を設定します。 仮想画像平面に形成される像は、上下左右反転せず、実際の物体と同じ向きになります。以降の議論はこの仮想画像平面に形成される像について議論します。

内部パラメータ – カメラ座標系から画像座標系への変換

カメラ座標系の原点から仮想画像平面までの距離を焦点距離 (Focal Length) といい、$f$ で表すことにします。 このとき、カメラ座標で $(X_c, Y_c, Z_c)$ で表される点の仮想画像平面上に投影された点の座標 $x_c, y_c$ を考えます。 この座標は、相似の関係より、以下のように求められます。

$$ x_c = f \frac{X_c}{Z_c}, y_c = f\frac{Y_c}{Z_c} $$

この変換は、同次座標系すると、以下のように表せます。

$$ Z_c \begin{pmatrix} x_c \\ y_c \\ 1 \end{pmatrix} = \begin{pmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix} \begin{pmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{pmatrix} $$

カメラ座標系で座標が $(x, y)$ である点を、単位がピクセルである座標系での座標 $(x’, y’)$ に変換するスケール係数を $k_x, k_y$ とします。 $k_x = k_y$ の場合、ピクセルの縦横比が同じことを意味します。

$$ x’ = k_x x, y’ = k_y y $$

カメラの種類によっては、座標系の X 軸と Y 軸が直行せず、Y 軸の斜行 (skew) が生じる場合があります。 X 軸と Y 軸が直交している座標系で座標が $(x, y)$ である点を、Y 軸が斜行した座標系での座標 $(x’, y’)$ に変換するには、以下のように計算できます。

$$ x’ = x + s y’, y’ = y $$

ただし、$s$ は斜行の程度を表すパラメータで、値が大きいほど歪みが大きいことを意味します。

カメラ座標系の原点は、カメラ座標系の Z 軸が通る点と異なります。 カメラ座標系での座標が $(x, y)$ である点を、左下を原点に設定した座標系での座標 $(x’, y’)$ に変換する平行移動量を $(c_x, c_y)$ とします。

$$ x’ = x + c_x, y’ = y + c_y $$

以上の変換を行列でまとめます。

$$ \begin{align*} h \begin{pmatrix} x_I \\ y_I \\ 1 \end{pmatrix} &= \underbrace{ \begin{pmatrix} 1 & 0 & c_x \\ 0 & 1 & c_y \\ 0 & 0 & 1 \\ \end{pmatrix}}_{平行移動} \underbrace{ \begin{pmatrix} 1 & s & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{pmatrix}}_{skew} \underbrace{ \begin{pmatrix} k_x & 0 & 0 \\ 0 & k_y & 0 \\ 0 & 0 & 1 \\ \end{pmatrix}}_{スケール} \begin{pmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix} \begin{pmatrix} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{pmatrix} \\ h \begin{pmatrix} x_I \\ y_I \\ 1 \end{pmatrix} &= \begin{pmatrix} f k_x & f k_y s & c_x & 0 \\ 0 & f k_y & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix} \begin{pmatrix} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{pmatrix} \end{align*} $$

ここで、$f_x \coloneqq k_x f, f_y \coloneqq k_y f$ とおくと、

$$ h \begin{pmatrix} x_I \\ y_I \\ 1 \end{pmatrix} = \begin{pmatrix} f_x & f_x s & c_x & 0 \\ 0 & f_y & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix} \begin{pmatrix} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{pmatrix} $$

この 5 つのパラメータを内部カメラパラメータ (Intrinsic Camera Parameters) といいます。

外部パラメータ – 世界座標系からカメラ座標系への変換

カメラ座標系とは別に世界座標系を定義して、世界座標系での座標が $(X_w, Y_w, Z_w)$ である点の仮想画像平面に投影された点の座標を考えます。 世界座標系でのある点 $(X_w, Y_w, Z_w)$ の座標をカメラ座標系での座標 $(X_c, Y_c, Z_c)$ に変換するための回転行列を $R$、平行移動成分を $\bm{t}$ としたとき、

$$ \begin{pmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{pmatrix} = \begin{pmatrix} r_{11} & r_{12} & r_{13} & t_1 \\ r_{21} & r_{22} & r_{23} & t_2 \\ r_{31} & r_{32} & r_{33} & t_3 \\ \end{pmatrix} \begin{pmatrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{pmatrix} = [R|t] \begin{pmatrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{pmatrix} $$

よって、

$$ h \begin{pmatrix} x_I \\ y_I \\ 1 \end{pmatrix} = \begin{pmatrix} f k_x & f k_y s & c_x & 0 \\ 0 & f k_y & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix} [R|t] \begin{pmatrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{pmatrix} $$

このとき、自由度が 6 であるパラメータ $R, t$ を外部カメラパラメータ (Extrinsic Camera Parameters) といいます。

参考

コメント

コメントする

目次