魚眼カメラのキャリブレーション 〜 レンズモデル

三次元復元をやっていく中で,魚眼カメラのキャリブレーションをする必要があったのですが,レンズモデルとかキャリブレーションのあたりを今までちゃんと勉強してこなかったのでまとめることにしました.

1.参考文献

参考文献は,OpenCV魚眼キャリブレーションの元となっている下記の論文です.Google ScholarでPdfをゲットできます.
A Generic Camera Model and Calibration Method for Conventional Wide-Angle, and Fish-Eye Lenses.

2.キャリブレーションって?

そもそも,キャリブレーションってなんなんだ?って話ですが,「撮影した点(x, y, z)がスクリーン上のどこに映し出されるかを表現する関係式を求める行為.」としてみました.これは自分定義なんで怪しいです(笑)

f:id:rkoichi2001:20190605141736j:plain
三次元点のカメラ画像上での投影点

上記の模式図の右下に変換のステップを書いたのですが,具体的には大きく分けて次の3つのステップになります.

ステップ1:世界座標からカメラ座標への変換

このステップは単なる座標変換です.世界座標系で表現された点(X, Y, Z)をカメラ座標系で表現し直すために座標変換を適用します.ただし,この変換をするためには,カメラ座標系の位置が正確にわかっていなければいけません.

必要なもの:世界座標系 -> カメラ座標系への変換行列(R, t)
入力:世界座標系で表現された点(X, Y, Z)
出力:カメラ座標系で表現された点(X', Y', Z')

ステップ2:レンズ歪みの適用

カメラ座標系で表現された点に対して,レンズ歪みの影響を適用します.具体的にはステップ1で求めた”カメラ座標系で表現された点(X', Y', Z')”に対して,奥行き1(Z'=1)のスクリーン上(正規化画像座標)での投影点(X' / Z', Y' / Z', 1)を計算し,この点に対してレンズモデルに応じた歪みを適用します.

必要なもの:レンズパラメータ(レンズモデルとそのモデルに応じた歪みパラメータ(F(θ)とそのパラメータ))
入力:カメラ座標系で表現された点(X', Y', Z')
出力:奥行き1(Z'=1)のスクリーン(正規化画像座標上)での投影点位置.(歪みは適用済)

ステップ3:画像座標への変換

正規化画像座標上での投影点位置が求まったので,あとはこれを画像座標に引き戻します.

必要なもの:カメラパラメータ(焦点距離,主点,ピクセルの一辺の長さ)
入力:正規化画像座標上での投影点位置(X' / Z', Y' / Z', 1)
出力:画像座標(u, v, 1)

外部パラメータと内部パラメータ

上記でリストアップした「必要なもの」ですが,外部パラメータ・内部パラメータと大きく2つに別れます.
外部パラメータ:世界座標系 -> カメラ座標系への変換行列(R, t)
内部パラメータ:レンズパラメータ,カメラパラメータ

カメラ座標系での3次元位置がわかっていれば,内部パラメータのみで投影点座標がわかりますが,もっと一般的なケースで,点が世界座標で表されている場合,投影点座標を知るためには外部パラメータが必要になります.今回のネタは内部パラメータのお話なので,ひとまず外部パラメータはおいておいて,2つの内部パラメータを求めます.ということで,早速レンズモデルの話に入っていきます.

3.Radially Symmetric Model (放射対称性モデル)

ステップ2ではレンズパラメータを計算しますが,そのまえに自分が使っているレンズに一番良く合うレンズモデルを選んで上げる必要があります.

中学・高校の理科や物理で出てきたと思うんですが,光線はレンズで屈折します.いつもの如く手描きの簡易図が下記になるのですが,ピンホールモデルで光学系を考えた場合,ピンホールの位置(下模式図の”ピンホールモデルの焦点”)が焦点になり,ここから撮像素子までの距離が焦点距離ということになります.

f:id:rkoichi2001:20190605125702j:plain
レンズによる光線の屈折

で,ピンホールを通過した光はスクリーン上のどこかに投影されることになりますが,この投影点のスクリーン中心からの距離を r として表現すると,模式図の角度θの関数として下記のように表現できます.

r = F(θ)

ピンホールカメラモデルの場合,レンズによる屈折が全く無いことになるので,直進してきた光はそのまま曲がることなくスクリーンに投影され,r = f * tan (θ) となります.ただ,実際にはレンズによる光の屈折があるので,実用上は使っているレンズに応じた一番適したモデルを当てはめてレンズの特性を表現してあげることになります.これがステップ2の計算前に実施する”レンズモデルの選択”になります.選択したレンズモデルによって画像に投影されるイメージがだいぶ変わってきますが,それぞれのモデルで投影された様子が下記リンク先のWikipediaの下の方(Comparison of mapping functions)に乗ってます.

en.wikipedia.org

4.レンズモデルの多項式近似

代表的な5つのレンズモデルを挙げたのですが,実際のレンズは大なり小なりモデルからのズレがあるということと,モデルによって数式を変えずにキャリブレーションできたら素敵やん?ということで,多項式近似します.

f:id:rkoichi2001:20190605150350j:plain
レンズモデルの多項式近似

で,この論文では最初の5項(θの9乗)くらいまでとってあげれば精度が十分出るとのことで,9次の多項式で以降論理展開していました.で,最後にレンズとスクリーン(正規化画像座標)と座標系の模式図です.以降この模式図に沿って数式が展開されていきます.

f:id:rkoichi2001:20190605152956j:plain
レンズとスクリーンと座標系

ここで,レンズモデルの多項式 r(θ) ですが,肝心のθは [0, θmax] の値を取ります.ここでθmaxの値はレンズのスペックを見れば大体の値がわかるかと思いますが,最大視野角です.上の式では「三次元点 -> 正規化画像座標点」の関係を表してますが,「画像上点 -> 三次元点(方向)」を求める場合は9次の方程式を解いてやって,出てきた解の中から [0, θmax] の間にあって,かつ実数のものを求めてやれば求まります.(または,同じように多項式近似してやって,係数を求めてもいいんですかね.)

ということで,次はアルゴリズム詳細に入っていきます.