Pinhole camera model

ピンホールカメラは、SLAMで使われるほとんどのカメラの標準モデルである。3次元点からの光は小さな穴(光学中心)を通過し、画像平面に投影される。このモデルは画像投影(image projection)、すなわち3次元世界の点が2次元ピクセルにどのように対応付けられるかを記述する。

座標系

以下の4つの座標系が関わる:

  1. ワールド座標系 Xw=[Xw,Yw,Zw]T\mathbf{X}_w = [X_w, Y_w, Z_w]^T:固定された基準座標系。
  2. カメラ座標系 Xc=[Xc,Yc,Zc]T\mathbf{X}_c = [X_c, Y_c, Z_c]^TZcZ_c は光学軸(前方を向く)。
  3. 画像平面 x=[x,y]T\mathbf{x}' = [x', y']^T:画像平面上のメトリック座標。
  4. ピクセル座標系 u=[u,v]T\mathbf{u} = [u, v]^T:離散的なピクセル座標。

一般的な慣例は XcX_c が右向き、YcY_c が下向き、ZcZ_c が前向きであり、これはピクセル座標 uu(右)と vv(下)に対応し、原点は画像の左上隅にある。

投影パイプライン

ステップ1:ワールド座標からカメラ座標へ。 剛体変換(外部パラメータ)がワールド座標点をカメラ座標系に変換する:

Xc=RXw+t\mathbf{X}_c = R\mathbf{X}_w + \mathbf{t}

ステップ2:カメラ座標から画像平面へ(透視除算)。

x=XcZc,y=YcZcx' = \frac{X_c}{Z_c}, \qquad y' = \frac{Y_c}{Z_c}

この深度による除算が透視効果の源であり ── そしてビジョン幾何学を興味深くしている非線形性の源でもある。座標 (x,y)(x', y') は**正規化座標(normalized coordinates)**と呼ばれる:これは内部パラメータを取り除いた後に残るものであり、多くの幾何学的な導出(基本行列、三角測量)はこの座標系で最もシンプルになる。

ステップ3:画像平面からピクセルへ(内部パラメータ)。

u=fxx+cx,v=fyy+cyu = f_x \cdot x' + c_x, \qquad v = f_y \cdot y' + c_y

ここで fx,fyf_x, f_y はピクセル単位の焦点距離、(cx,cy)(c_x, c_y) は主点である。ピクセル焦点距離は物理的な焦点距離 ff(mm単位)とピクセルサイズを関連付ける:fx=f/(ピクセル幅)f_x = f / (\text{ピクセル幅}) であり、これがピクセルが正方形でない場合に fxfyf_x \neq f_y となる理由である。

行列形式

すべてのステップを斉次座標でまとめると:

Zc[uv1]=[fx0cx0fycy001]K[Rt][XwYwZw1]Z_c \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \underbrace{\begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}}_{\mathbf{K}} \begin{bmatrix} R & \mathbf{t} \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}

行列 K\mathbf{K} は**カメラ内部パラメータ行列(camera intrinsic matrix)であり、P=K[Rt]P = \mathbf{K}[R|\mathbf{t}]3×43 \times 4カメラ投影行列(camera projection matrix)**である。一般的な場合、K\mathbf{K} にはスキュー(skew)パラメータが含まれる(現代のカメラでは通常ゼロ)。

このパイプラインをそのままNumPyに翻訳したもの:

import numpy as np

def project(K, R, t, X_w):
    X_c = R @ X_w + t          # world -> camera
    x_n = X_c[:2] / X_c[2]     # perspective division (normalized coords)
    u   = K[0, 0] * x_n[0] + K[0, 2]
    v   = K[1, 1] * x_n[1] + K[1, 2]
    return np.array([u, v])

逆投影:逆写像はレイになる

投影は1次元の情報を失う:1つのピクセルは3次元点を一意に決定せず、1本の**レイ(ray)**のみを決定する。ピクセル u\mathbf{u} が与えられると、カメラ座標系における可能な3次元点のレイは

Xc(λ)=λK1[uv1],λ>0\mathbf{X}_c(\lambda) = \lambda\,\mathbf{K}^{-1}\begin{bmatrix}u\\v\\1\end{bmatrix}, \qquad \lambda > 0

失われた深度 λ\lambda を復元することこそが、三角測量(複数視点)、ステレオ(もう1台のキャリブレーション済みカメラ)、あるいは深度センサーが提供するものである。視野角も同じ幾何学から導かれる:画像幅 WW に対して FoVx=2arctan ⁣(W2fx)\mathrm{FoV}_x = 2\arctan\!\big(\tfrac{W}{2f_x}\big) となる。

よくある落とし穴

SLAMにおける意義

このモデルで定義される投影関数 π()\pi(\cdot) は、すべてのvisual SLAMシステムの核心にある:バンドル調整で最小化される再投影誤差 e=zπ(TX)\mathbf{e} = \mathbf{z} - \pi(T\mathbf{X}) は、「ピンホールモデルでマップ点を投影し、測定されたピクセルと比較する」ということに他ならない。三角測量、PnP、エピポーラ幾何はすべて同じ方程式から導出されるため、このパイプラインをゼロから導出することは、このレベルで最も価値のある演習である。

関連ノート