魚眼カメラモデル (fisheye camera model) |
2018-07-23 - 2018-08-10 (update) |
|
|
*魚眼カメラモデル とは
魚眼カメラにおいて,3次元空間中の物体の位置と,カメラの画像上での位置の関係を表すモデルです.一般的な[link:カメラモデル]では,3次元上の点を仮想的に設定する平面に投影します.しかしこのモデルは,180度近い画角を持つ魚眼カメラではうまく成り立ちません.そこで,魚眼カメラについては3次元上の点を球面に投影するモデルが利用されています.
[img:y3nm]
{{small:図1 魚眼カメラを用いて撮影した画像 画像出典 wikipedia [link:https://ja.wikipedia.org/wiki/魚眼レンズ]}}
図2と図3は,3次元上の点を平面に投影する方法と,球面に投影する方法を比較して表しています.まず,カメラの前方,中心から角度の小さいに点Aは,仮想的に設定する平面に乗るように問題なく投影できそうです.ただ,中心から角度の大きい点Bは,うまく平面に乗るように投影させることが難しそうです.もちろん,数値上は投影可能ですが,極端に離れた位置に投影されることになると思います.これに対し,球面上に投影する方法はで角度に対して球面上に均等に点を投影できます.
[img:zrws]
{{small:図2 3次元上の点を平面に投影する方法}}
[img:npl3]
{{small:図3 3次元上の点を曲面に投影する方法}}
魚眼カメラのモデルやキャリブレーションについて詳しく学びたい場合,[1]の論文が参考になります.
{{small:[1]J.Kannala, S.Brandt, "A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses", IEEE Transactions on Pattern Analysis and Machine Intelligence(PAMI), 2006}}
{{small:[link:http://www.ee.oulu.fi/mvg/files/pdf/pdf_697.pdf] }}
また,OpenCVにおける魚眼カメラの実装上の仕様は下記のリンクから参照できます.
{{small:OpenCV document [link:https://docs.opencv.org/trunk/db/d58/group__calib3d__fisheye.html] }}
以降の節では,3次元上の点{$(X_C, Y_C, Z_C)$}と画像上の点{$(u, v)$}の関係を順に説明します.
**角度の計算
まず,カメラの中心を{$C$}として球を定義します.そして物体上の点{$P$}を球面上に投影した時の角度θを三角関数に基づいて計算します.ここでいう角度θは,図4に示す様にカメラの視線方向(Z方向 青の矢印)を基準とした角度です.
{$ a = \frac{X_C}{Z_C}, b = \frac{Y_C}{Z_C}$}
{$ r^2 = a^2 + b^2 $}
{$$ \theta = \arctan (r) \tag{1}$$}
[img:rjwq]
{{small:図4 視線方向を基準とした角度θ}}
**レンズ歪み
角度θが決まれば,画像の中心からの距離が決まります.ただし,式(1)を基準としたレンズ歪みの影響を考慮して補正分を考える必要があります.図5は,歪みの有無の影響を比較しています.図5の青い円は,等間隔に角度θを変えたときに,画像上に投影する位置を等高線として表しています.歪みがないと画像上で等間隔ですが,歪みがあると粗密が発生します.このレンズ歪みの影響は,次の式でモデル化されています.
{$$ \theta ' = \theta (1+k_1 \theta^2 +k_2 \theta^4+k_3 \theta^6+k_4 \theta^8) $$}
[img:f7ws]
{{small:図5 角度θの等高線 (a)レンズ歪がない例,(b)レンズ歪みがある例}}
**平面の正規化画像座標への投影
レンズ歪を考慮した後,球面上の点を平面の座標系{$(x', y')$}に投影します.具体的に,下記の式に示す様に単純に{$a$},{$b$}の比率に合わせて計算します.
{$ x' = \cfrac{a}{r} \theta ', y' = \cfrac{b}{r} \theta ' $}
ここで,{$r$}で割っているのは,中心からの位置を正規化するためです.また,投影した平面の座標系は,一般的なカメラモデルと同じく正規化画像座標と呼ばれているようです[1].
**カメラ行列(正規化画像座標→デジタル画像座標)
正規化画像座標系での位置{$(x', y')$}を,画像の左上を原点とした[pixel]のスケールで位置を表現します.式は一般的なカメラモデルと同じで,下記のように定義されています.
{$$\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*}$$}
{{small:※補足:カメラ行列は,スキュー(1行2列の要素)に変数を設定してモデル化する場合も有ります.}}
**まとめ
これまで説明した変換をまとめます.
・角度の計算
{$ a = \frac{X_C}{Z_C}, b = \frac{Y_C}{Z_C}$}
{$ r^2 = a^2 + b^2 $}
{$$ \theta = \arctan (r) $$}
・レンズ歪み
{$$ \theta ' = \theta (1+k_1 \theta^2 +k_2 \theta^4+k_3 \theta^6+k_4 \theta^8) $$}
・平面の正規化画像座標への投影
{$ x' = \cfrac{a}{r} \theta ', y' = \cfrac{b}{r} \theta ' $}
・カメラ行列
{$$\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*}$$}
以上式を経由して,{$(X_C, Y_C, Z_C)$}と{$(u, v)$}の関係が決まります
>> ご意見・ご質問など お気軽にご連絡ください.info