熱血エンジニアのメモ用紙

手を動かして理解したこと / 技術メモ を残していくブログ

ワールド座標系の基礎2

前回の記事

nekketsu-engineer.hatenablog.com

では, 画像座標系とワールド座標系の関係を結び付ける式について, 一般座標系を用いて説明しました. 本記事では, より一般的な同次座標系を用いた表現についてまとめます.

同次座標による座標系の表現

ここでは, 3D のワールド座標系を 2D に投影する際に必要となる透視変換を考えるうえで必要となる同次座標による座標系の表現についてまとめる.

座標変換の基礎

二次元座標の基本的な座標変換(拡大/縮小/回転/鏡像/スキュー)は, ベクトルと行列を用いて $$\boldsymbol{x'}=\boldsymbol{A}\boldsymbol{x}$$ と表現される. ここで, $$ \boldsymbol{x}= \begin{pmatrix} x \\ y \end{pmatrix} , \boldsymbol{x'}= \begin{pmatrix} x' \\ y' \end{pmatrix} , \boldsymbol{A}= \begin{pmatrix} a & b \\ c & d \end{pmatrix} $$ である.

平行移動を考える

非常に簡単な以下の式で表現できる. $$x' = x + t_x$$ $$y'= y + t_y$$ 数式自体は非常に単純であるが, 前節で定義したベクトルと行列を用いた形式では表現は不可能で, 行列の掛け算で表現できなくなり取り扱いが面倒である.

=> 同次座標系を用いてベクトル演算で記述できるようにすると便利 !!

同次座標

簡単のため 2 次元座標系で説明する. 座標  (x,y) に対して, 要素数を 1 つ増やした座標  (\xi_1,\xi_2,\xi_3) を以下の関係式を満たすように定義する. ただし, 少なくとも一つの要素は 0 ではないものとする. しばしば,  \xi_3=1 が選ばれる. $$x=\frac{\xi_1}{\xi_3}$$ $$y=\frac{\xi_2}{\xi_3}$$

例: $$(x,y) = (1,2)$$ $$(\xi_1,\xi_2,\xi_3) = (1,2,1)$$

元々の座標系に戻す際, 定数倍した座標(同値関係)も同じ座標となる.

座標系変換の同次座標による記述

平行移動

$$ \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} \sim \begin{pmatrix} 1 &0 &t_x \\ 0 &1 &t_y \\ 0 &0 &1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} $$

線形変換

$$ \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} \sim \begin{pmatrix} a &b &0 \\ c &d &0 \\ 0 &0 &1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} $$

アフィン変換 (affine transformation)

任意の線形変換と平行移動を組み合わせた変換. 変換行列は, 平行移動と線形変換の合成変換となる.

$$ \begin{align} \begin{pmatrix} 1 &0 &t_x \\ 0 &1 &t_y \\ 0 &0 &1 \end{pmatrix} \begin{pmatrix} a &b &0 \\ c &d &0 \\ 0 &0 &1 \end{pmatrix} &= \begin{pmatrix} a &b &t_x \\ c &d &t_y \\ 0 &0 &1 \end{pmatrix} \end{align} $$

射影変換 (projective transformation)

アフィン変換よりも一般化された表現. $$ \tilde{\boldsymbol{x'}} \sim \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} , \tilde{\boldsymbol{x}} \sim \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} , \boldsymbol{H} \sim \begin{pmatrix} h_{11} &h_{12} &h_{13} \\ h_{21} &h_{22} &h_{23} \\ h_{31} &h_{32} &h_{33} \end{pmatrix} $$

を用いて,

$$\tilde{\boldsymbol{x'}} \sim \boldsymbol{H} \tilde{\boldsymbol{x}} $$ と定義される. 座標 $(x', y')$ は同次座標の定義より

$$ x' = \frac{h_{11}x+h_{12}y+h_{13}}{h_{31}x+h_{32}y+h_{33}} $$ $$ y' = \frac{h_{21}x+h_{22}y+h_{23}}{h_{31}x+h_{32}y+h_{33}} $$

となる.

同次座標によるワールド座標の表現

これまでの説明で述べた通り, 正規化画像座標, 画像座標, カメラ座標, ワールド座標はそれぞれ $$ \boldsymbol{x}= \begin{pmatrix} x \\ y \end{pmatrix} , \boldsymbol{m}= \begin{pmatrix} u \\ v \end{pmatrix} , \boldsymbol{X}= \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} , \boldsymbol{X_w}= \begin{pmatrix} X_w \\ Y_w \\ Z_w \end{pmatrix} $$

であるとする. これらの座標の同次座標表現はそれぞれ, $$ \tilde{\boldsymbol{x}} \sim \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} , \tilde{\boldsymbol{m}} \sim \begin{pmatrix} u \\ v \\ 1 \end{pmatrix} , \tilde{\boldsymbol{X}} \sim \begin{pmatrix} X \\ Y \\ Z \\ 1 \end{pmatrix} , \tilde{\boldsymbol{X_w}} \sim \begin{pmatrix} X_w \\ Y_w \\ Z_w \\1 \end{pmatrix} $$ となる.

正規化画像座標系とカメラ画像系の関係

前述の,

$$x = \frac{X}{Z}$$ $$y = \frac{Y}{Z}$$ を同次座標で表現すると, $$ \begin{align} \tilde{\boldsymbol{x}} \sim \begin{pmatrix} 1 &0 &0 &0 \\ 0 &1 &0 &0 \\ 0 &0 &1 &0 \end{pmatrix} \begin{pmatrix} X \\ Y \\ Z \\ 1 \end{pmatrix} &= (\boldsymbol{I} | 0)\tilde{\boldsymbol{X}} \end{align} $$

カメラ座標系とワールド座標系の関係

前述の, $$ \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} = \boldsymbol{R} \begin{pmatrix} X_w \\ Y_w \\ Z_w \end{pmatrix} + \boldsymbol{t} $$ を同次座標で表現すると, $$ \tilde{\boldsymbol{X}} \sim \boldsymbol{M} \tilde{\boldsymbol{X_w}} $$ ここで, $$ \begin{align} \boldsymbol{M} \sim \begin{pmatrix} \boldsymbol{R} &\boldsymbol{t} \\ 0^T &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 \\ 0 &0 &0 &1 \end{pmatrix} \end{align} $$

画像座標と正規化画像座標の関係

$$\tilde{\boldsymbol{m}} \sim \boldsymbol{A}\tilde{\boldsymbol{x}}$$ ただし、 \boldsymbol{A} は以下のようなカメラ内部パラメータからなる 3x3 の行列である. $$ \boldsymbol{A} = \begin{pmatrix} \frac{f}{\delta_u} &0 &c_u \\ 0 &\frac{f}{\delta_v} &c_v \\ 0 &0 &1 \end{pmatrix} $$

ワールド座標系と画像座標の関係

$$ \begin{align} \tilde{\boldsymbol{m}} &\sim \boldsymbol{A}\tilde{\boldsymbol{x}} \\ &\sim \boldsymbol{A}(\boldsymbol{I}|0) \tilde{\boldsymbol{X}} \\ &\sim \boldsymbol{A}(\boldsymbol{I}|0) \begin{pmatrix} \boldsymbol{R} &\boldsymbol{t} \\ 0^T &1 \end{pmatrix} \tilde{\boldsymbol{X_w}} \\ &\sim \boldsymbol{A}(\boldsymbol{R}|\boldsymbol{t}) \tilde{\boldsymbol{X_w}} \end{align} $$

ここで, 透視変換行列(カメラ行列)  \boldsymbol{P} = \boldsymbol{A}(\boldsymbol{R}|\boldsymbol{t}) とすると,

$$ \tilde{\boldsymbol{m}} \sim \boldsymbol{P} \tilde{\boldsymbol{X_w}} $$

という簡単な式で表現できる.

参考文献