カメラ行列

カメラ行列（カメラぎょうれつ、英語: camera matrix）または（カメラ）射影行列（とうえいぎょうれつ、英語: projection matrix）はコンピュータビジョンの分野で用いられる3次元空間内の3次元点から画像内の2次元点へのピンホールカメラモデルによる投影を記述する 3 × 4 {\displaystyle 3\times 4} 行列である。 x {\displaystyle \mathbf {x} } を同次座標（4次元ベクトル）での3次元点の表現とし、 y {\displaystyle \mathbf {y} } を同次座標（3次元ベクトル）でのピンホールカメラモデルでこの点を投影したときの画像上の点の表現とすると、次の関係が成り立つ y ∼ C x {\displaystyle \mathbf {y} \sim \mathbf {C} \,\mathbf {x} } ここで C {\displaystyle \mathbf {C} } はカメラ行列で、記号 ∼ {\displaystyle \,\sim } は、左辺と右辺が非ゼロのスカラー倍を許容して等しいことを意味する。 カメラ行列 C {\displaystyle \mathbf {C} } は2つの射影空間の要素間の写像に関与するため、これも射影要素とみなせる。これは、スカラー倍（ゼロ以外）したカメラ行列も元と等価なカメラ行列になるため、自由度が11しかないことを意味する。 ピンホールカメラモデルによると、3次元点 P の座標から、画像平面への点の投影の2次元画像座標へのマッピングは、次の式で与えられる。 ( y 1 y 2 ) = f x 3 ( x 1 x 2 ) {\displaystyle {\begin{pmatrix}y_{1}\\y_{2}\end{pmatrix}}={\frac {f}{x_{3}}}{\begin{pmatrix}x_{1}\\x_{2}\end{pmatrix}}} ここで ( x 1 , x 2 , x 3 ) {\displaystyle (x_{1},x_{2},x_{3})} は、カメラ中心座標系に対する P の3次元座標、 ( y 1 , y 2 ) {\displaystyle (y_{1},y_{2})} は結果となる画像座標、f はカメラの焦点距離で f > 0 と仮定する。また、 x3 > 0 であると仮定する。 カメラ行列を導出するために、上記の式を同次座標で書き直す。2次元ベクトル ( y 1 , y 2 ) {\displaystyle (y_{1},y_{2})} の代わりに射影要素（3次元ベクトル） y = ( y 1 , y 2 , 1 ) {\displaystyle \mathbf {y} =(y_{1},y_{2},1)} を考え、等式の代わりに ∼ {\displaystyle \,\sim } で示されるゼロ以外の数値によるスケーリングまで許容するような等式を考える。まず、同次画像座標を通常の3次元座標の式として記述する。 ( y 1 y 2 1 ) = ( f x 3 x 1 f x 3 x 2 1 ) ∼ ( x 1 x 2 x 3 f ) {\displaystyle {\begin{pmatrix}y_{1}\\y_{2}\\1\end{pmatrix}}={\begin{pmatrix}{\frac {f}{x_{3}}}x_{1}\\{\frac {f}{x_{3}}}x_{2}\\1\end{pmatrix}}\sim {\begin{pmatrix}x_{1}\\x_{2}\\{\frac {x_{3}}{f}}\end{pmatrix}}} 最後に、3次元座標も同次表現 x {\displaystyle \mathbf {x} } で表され、カメラ行列は次のように表される。 ( y 1 y 2 1 ) ∼ ( 1 0 0 0 0 1 0 0 0 0 1 f 0 ) ( x 1 x 2 x 3 1 ) {\displaystyle {\begin{pmatrix}y_{1}\\y_{2}\\1\end{pmatrix}}\sim {\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&{\frac {1}{f}}&0\end{pmatrix}}\,{\begin{pmatrix}x_{1}\\x_{2}\\x_{3}\\1\end{pmatrix}}}  または  y ∼ C x {\displaystyle \mathbf {y} \sim \mathbf {C} \,\mathbf {x} } ここで C {\displaystyle \mathbf {C} } はカメラ行列で、ここでは次の式で与えられる。 C = ( 1 0 0 0 0 1 0 0 0 0 1 f 0 ) {\displaystyle \mathbf {C} ={\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&{\frac {1}{f}}&0\end{pmatrix}}} 、 そして対応するカメラ行列は次のようになる。 C = ( 1 0 0 0 0 1 0 0 0 0 1 f 0 ) ∼ ( f 0 0 0 0 f 0 0 0 0 1 0 ) {\displaystyle \mathbf {C} ={\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&{\frac {1}{f}}&0\end{pmatrix}}\sim {\begin{pmatrix}f&0&0&0\\0&f&0&0\\0&0&1&0\end{pmatrix}}} 最後のステップは、 C {\displaystyle \mathbf {C} } 自体が射影要素であることの結果である。 ここで導出されたカメラ行列は、ゼロ以外の要素がほとんど含まれていないという意味で自明に見えるかもしれない。これは、3次元点および2次元点に選ばれた特定の座標系に大きく依存する。ただし、実際には、以下に示すように他の形式のカメラ行列が一般的である。 前のセクションで導出されたカメラ行列 C {\displaystyle \mathbf {C} } には、次のベクトルがまたがる零空間がある。 n = ( 0 0 0 1 ) {\displaystyle \mathbf {n} ={\begin{pmatrix}0\\0\\0\\1\end{pmatrix}}} これは、座標 (0,0,0) を持つ3次元点の同次表現でもある。つまり、「カメラの中心」（入射瞳とも呼ばれるピンホール カメラのピンホールの位置）は O にある。つまり、カメラの中心は（そしてこの点だけが）、カメラによって画像平面内の点にマッピングすることができない（あるいは、画像上のすべての光線はこのポイントを通過するため、画像上のすべての点にマッピングされる）。 x 3 = 0 {\displaystyle x_{3}=0} の他の3次元点の場合、結果の y ∼ C x {\displaystyle \mathbf {y} \sim \mathbf {C} \,\mathbf {x} } は well-defined であり、 y = ( y 1 y 2 0 ) ⊤ {\displaystyle \mathbf {y} =(y_{1}\,y_{2}\,0)^{\top }} の形式になる。これは、射影画像平面の無限遠点に対応する（ただし、画像平面がユークリッド平面であるとみなされる場合、対応する交点は存在しない）。 f = 1 と仮定すると、上で導出されたカメラ行列をさらに単純化できる。 C 0 = ( 1 0 0 0 0 1 0 0 0 0 1 0 ) = ( I 0 ) {\displaystyle \mathbf {C} _{0}={\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\end{pmatrix}}=\left({\begin{array}{c|c}\mathbf {I} &\mathbf {0} \end{array}}\right)} ここで I {\displaystyle \mathbf {I} } は 3 × 3 {\displaystyle 3\times 3} 恒等行列である。ここでの 3 × 4 {\displaystyle 3\times 4} 行列 C {\displaystyle \mathbf {C} } は、 3 × 3 {\displaystyle 3\times 3} 行列と3次元ベクトルの連結に分割されることに注意されたい。カメラ行列 C 0 {\displaystyle \mathbf {C} _{0}} は正準形式（英語: canonical form）と呼ばれることもある。 ここまでで、3次元空間内のすべての点はカメラ中心座標系、つまりカメラ中心（ピンホールカメラのピンホールの位置）に原点を持つ座標系で表される。しかし実際は、3次元点は任意の座標系 (X1', X2', X3') に対する座標として表せる。カメラの座標軸 (X1, X2, X3) とある座標軸 (X1', X2', X3') がユークリッド型（直交かつ等方）であると仮定すると、2つの座標系の間にユークリッド3次元変換（回転と平行移動）が唯一存在する。つまりカメラは原点にあり z 軸方向を見ている必要はないということである。 3次元座標の回転と平行移動という2つの操作は、次の2つの 4 × 4 {\displaystyle 4\times 4} 行列として表せる。 ( R 0 0 1 ) {\displaystyle \left({\begin{array}{c|c}\mathbf {R} &\mathbf {0} \\\hline \mathbf {0} &1\end{array}}\right)} と ( I t 0 1 ) {\displaystyle \left({\begin{array}{c|c}\mathbf {I} &\mathbf {t} \\\hline \mathbf {0} &1\end{array}}\right)} ここで R {\displaystyle \mathbf {R} } は 3 × 3 {\displaystyle 3\times 3} 回転行列であり、 t {\displaystyle \mathbf {t} } は3次元並進ベクトルである。1番目の行列が3次元点の同次表現に乗算されると、結果は回転した点の同次表現になり、2番目の行列は同様に平行移動を実行する。2つの操作を順番に、つまり、最初に回転、次に平行移動（回転後の座標系で表された平行移動ベクトルを使用）を実行すると、回転と平行移動を組み合わせた行列が得られる。 ( R t 0 1 ) {\displaystyle \left({\begin{array}{c|c}\mathbf {R} &\mathbf {t} \\\hline \mathbf {0} &1\end{array}}\right)} R {\displaystyle \mathbf {R} } と t {\displaystyle \mathbf {t} } がちょうど上記の2つの座標系 (X1, X2, X3) と (X1', X2', X3') を関係づける回転と平行移動であると仮定すると、これは次のことを意味する。 x = ( R t 0 1 ) x ′ {\displaystyle \mathbf {x} =\left({\begin{array}{c|c}\mathbf {R} &\mathbf {t} \\\hline \mathbf {0} &1\end{array}}\right)\mathbf {x} '} ここで x ′ {\displaystyle \mathbf {x} '} は座標系 (X1', X2', X3') における点 P の同次表現である。 また、カメラ行列が C 0 {\displaystyle \mathbf {C} _{0}} で与えられると仮定すると (X1, X2, X3) 系の座標から同次画像座標へのマッピングは次のようになる。 y ∼ C 0 x = ( I 0 ) ( R t 0 1 ) x ′ = ( R t ) x ′ {\displaystyle \mathbf {y} \sim \mathbf {C} _{0}\,\mathbf {x} =\left({\begin{array}{c|c}\mathbf {I} &\mathbf {0} \end{array}}\right)\,\left({\begin{array}{c|c}\mathbf {R} &\mathbf {t} \\\hline \mathbf {0} &1\end{array}}\right)\mathbf {x} '=\left({\begin{array}{c|c}\mathbf {R} &\mathbf {t} \end{array}}\right)\,\mathbf {x} '} したがって、座標系 (X1',X2',X3') の点を画像座標に関連付けるカメラ行列は、次のような3次元回転行列と3次元平行移動ベクトルの連結となる。 C N = ( R t ) {\displaystyle \mathbf {C} _{N}=\left({\begin{array}{c|c}\mathbf {R} &\mathbf {t} \end{array}}\right)} このタイプのカメラ行列は正規化されたカメラ行列と呼ばれ、焦点距離 = 1 であり、画像座標は原点が軸 X3 と画像平面の交点に位置し、3次元座標と同じ単位で測定されることを仮定している。結果の画像座標は、正規化された画像座標と呼ばれる。 ここでも、上記の正規化されたカメラ行列 C N {\displaystyle \mathbf {C} _{N}} の零空間は、4次元ベクトルによって渡っている。 n = ( − R − 1 t 1 ) = ( n ~ 1 ) {\displaystyle \mathbf {n} ={\begin{pmatrix}-\mathbf {R} ^{-1}\,\mathbf {t} \\1\end{pmatrix}}={\begin{pmatrix}{\tilde {\mathbf {n} }}\\1\end{pmatrix}}} これもやはりカメラの中心の座標であり、 (X1', X2', X3') 系で表現されている。これは最初に回転を適用し、次に平行移動を3次元ベクトル n ~ {\displaystyle {\tilde {\mathbf {n} }}} に適用することで確認できる。結果は、3次元座標 (0,0,0) の同次表現となる。 これは、カメラの中心（同次表現）が、カメラ行列が参照している座標系と同じ座標系を基準とした3次元座標で表現されている場合、カメラ行列の零空間にあることを意味する。 正規化されたカメラ行列 C N {\displaystyle \mathbf {C} _{N}} は次のように記述できる。 C N = R ( I R − 1 t ) = R ( I − n ~ ) {\displaystyle \mathbf {C} _{N}=\mathbf {R} \,\left({\begin{array}{c|c}\mathbf {I} &\mathbf {R} ^{-1}\,\mathbf {t} \end{array}}\right)=\mathbf {R} \,\left({\begin{array}{c|c}\mathbf {I} &-{\tilde {\mathbf {n} }}\end{array}}\right)} ここで n ~ {\displaystyle {\tilde {\mathbf {n} }}} は (X1',X2',X3') 系に対するカメラの3次元座標である。 正規化されたカメラ行列により生成されたマッピングが与えられると、結果の正規化された画像座標は、任意の2次元ホモグラフィによって変換できる。これには、2次元の平行移動と回転とスケーリング（等方性と異方性）だけでなく、一般的な二次元透視変換も含まれる。このような変換は正規化された同次画像座標 y {\displaystyle \mathbf {y} } を変換された同次画像座標 y ′ {\displaystyle \mathbf {y} '} にマッピングする 3 × 3 {\displaystyle 3\times 3} 行列 H {\displaystyle \mathbf {H} } として表せる。 y ′ = H y {\displaystyle \mathbf {y} '=\mathbf {H} \,\mathbf {y} } 3次元座標に関して正規化された画像座標に上記の式を挿入すると、 y ′ = H C N x ′ {\displaystyle \mathbf {y} '=\mathbf {H} \,\mathbf {C} _{N}\,\mathbf {x} '} こうして、最も一般的な形式のカメラ行列が得られる。 C = H C N = H ( R t ) {\displaystyle \mathbf {C} =\mathbf {H} \,\mathbf {C} _{N}=\mathbf {H} \,\left({\begin{array}{c|c}\mathbf {R} &\mathbf {t} \end{array}}\right)} 3次元投影 カメラリセクショニング Richard Hartley and Andrew Zisserman (2003). Multiple View Geometry in computer vision. Cambridge University Press. ISBN 0-521-54051-8