2017-07-09 - 2018-07-23 (update) |
|
|
*カメラモデル とは
3次元空間中の物体の位置と,カメラの画像上での位置の関係を表すモデルです.ここでは,コンピュータビジョンの分野で良く利用される透視投影に基づくカメラモデルについて解説します.
まず,物体のある部分{$P$}の位置を,カメラの中心{$C$}を原点として{$(X_C, Y_C, Z_C)$}と設定します.次に,{$P$}が観測されるカメラの画像上での位置を{$(u, v)$}とします.この位置の関係を図1に示します.
[img:mpsg]
{{small:図1 現実空間中の位置と画像上での位置の関係}}
以降の節では,{$(X_C, Y_C, Z_C)$}と{$(u, v)$}の関係を3つの要素に分解して一つ一つ順番に説明していきます.
**ピンホールカメラと透視投影
まず,図2のようなピンホールカメラを考えます.
[img:7ksp]
{{small:図2 ピンホールカメラの構造}}
ここで,3次元空間中の各部の光は,ピンホールと呼ばれる小さな穴を通って背後にある画像面に投影されます.
{{small:なお,一般的なカメラは,レンズを使って光をより多く集められるようにしています.後で説明しますが,レンズを使うことで投影される像に歪みが発生します.}}
この時,投影される像は左右上下が反転します.この反転はややこしいので,図3のように仮想的にピンホールの前に画像面があると考えます.
[img:m7zy]
{{small:図3 左:ピンホールの背後に画像面を設定,右:ピンホールの前に仮想的に画像面を設定}}
{$P$}が画像面に投影される2次元位置を{$(x, y)$}とします.画像面を単位距離{$Z=1$}にあると考えて,図4に示す三角形の関係から次の式を得ることができます.
[img:bpw3]
{{small:図4 画像面を真横から見た図}}
{$$\begin{align*}x &= X_C / Z_C\\y &= Y_C / Z_C \end{align*}$$}
この式の変換を,透視投影(変換)と呼びます.また,同次座標系の表現で,次の行列の式で表すこともできます.
{$$ s\begin{bmatrix} x\\y\\1 \end{bmatrix}=\begin{bmatrix} X_C\\Y_C\\Z_C \end{bmatrix}$$}
なお,この2次元位置{$(x, y)$}は,画像面の中心を原点とした座標系で表現します.{$Z=1$}の基準位置に配置した画像面を考えるところから,この座標系を正規化画像座標系と呼びます.
**レンズ歪み
透視投影した位置{$(x, y)$}は,実際はレンズ歪みの影響を受けてずれた位置{$(x', y')$}で観測されることになります.具体的には,例えば図5のように像が変化します.
[img:rlwc]
{{small:図5 レンズ歪みの例}}
この変化は,次のレンズ歪みのモデルに基づいて計算します.
{$$\begin{align*}
x' &= x (1+k_1 r^2 + k_2 r^4 + k_3 r^6) + (2 p_1 xy + p_2 (2 x^2 + r^2)) \\
y' &= y (1+k_1 r^2 + k_2 r^4 + k_3 r^6) + (p_1 (2 y^2 + r^2) + 2 p_2 xy)
\end{align*}$$}
{$(r^2 = x^2 + y^2)$}
ここで,{$(k_1, k_2, k_3, p_1, p_2)$}は歪みの具合を表すパラメータです.このパラメータは[link:カメラキャリブレーション]によって,事前に求めておくことができます.
**カメラ行列(正規化画像座標→デジタル画像座標)
正規化画像座標系での位置p'{$(x', y')$}は,画像平面の中心を原点として位置を表現します.これに対し,カメラで撮影した画像は,一般的には画像の左上を原点として,[pixel]のスケールで位置を表現します.この関係を図6に示します.
[img:7y3g]
{{small:図6 正規化画像座標系(歪み付加)とデジタル画像座標系の関係}}
デジタル画像座標系での位置{$(u, v)$}は次の式で計算できます.
{$$\begin{align*}
\begin{bmatrix} u\\v\\1 \end{bmatrix}
=\begin{bmatrix} f_x&0&c_x \\ 0&f_y&c_y \\ 0&0&1 \end{bmatrix} \begin{bmatrix} x'\\y'\\1 \end{bmatrix}
=K \begin{bmatrix} x'\\y'\\1 \end{bmatrix}
\end{align*}$$}
ここで,{$K$}はカメラ行列やカメラパラメータ行列と呼びます.その要素の,{$(f_x,
f_y)$}は正規化画像座標系とデジタル画像座標系のスケールの違いを表すパラメータです.{$(c_x,
c_y)$}は2つの座標系のオフセットを表すパラメータです.大雑把には画像の中心と画像の左上の座標の差になります.ただし,カメラ内部のハードウェアの微小なずれの影響から,正確には少しずれた数値になります.
{{small:※補足:カメラ行列は,スキュー(1行2列の要素)に変数を設定してモデル化する場合も有ります.}}
**まとめ
これまで説明した変換をまとめます.
・透視投影変換
{$$ s\begin{bmatrix} x\\y\\1 \end{bmatrix}=\begin{bmatrix} X_C\\Y_C\\Z_C \end{bmatrix}$$}
・レンズ歪み
{$$\begin{align*}
x' &= x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + (2 p_1 xy + p_2 (2 x^2 + r^2)) \\
y' &= y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + (p_1 (2 y^2 + r^2) + 2 p_2 xy)
\end{align*}$$}
・カメラ行列
{$$\begin{align*}
\begin{bmatrix} u\\v\\1 \end{bmatrix}
=\begin{bmatrix} f_x&0&c_x \\ 0&f_y&c_y \\ 0&0&1 \end{bmatrix} \begin{bmatrix} x'\\y'\\1 \end{bmatrix}
\end{align*}$$}
以上3つの変換を経由して,{$(X_C, Y_C, Z_C)$}と{$(u, v)$}の関係が決まります.また,事前にカメラキャリブレーションを済ませておくこと,レンズ歪みの影響をキャンセルした補正画像を得ることができます.その場合,レンズ歪みの式は無視して次のように式をまとめることもできます.
{$$\begin{align*}
t \begin{bmatrix} u\\v\\1 \end{bmatrix}
=\begin{bmatrix} f_x&0&c_x \\ 0&f_y&c_y \\ 0&0&1 \end{bmatrix} \begin{bmatrix} X_C\\Y_C\\Z_C \end{bmatrix}
\end{align*}$$}
>> ご意見・ご質問など お気軽にご連絡ください.info