Fisheye Camera Calibration
Contents
Projection Model
魚眼レンズは普通のレンズ(透視投影レンズ)と異なる投影モデルとなる。以下に挙げた中心射影以外の投影モデルは全てまとめて魚眼投影と呼ばれる。全て、光軸からの角度θと焦点距離fに対応して結像の大きさrが決まる。
中心投影 |
Perspective Projection |
r = f tanθ |
立体射影 |
Stereographic Projection |
r = 2f tan(θ/2) |
等距離射影 |
Equidistant Projection |
r = fθ |
等立体角射影 |
Equal Area Projection |
r = 2f sin(θ/2) |
正射影 |
Orthographic Projection |
r = f sinθ |
これらのモデルは2つのパラメータ(k1, k2)を使って統一的に表現することができる
r = f * k1 * sin ( θ / k1 ) / cos ( k2 * θ / k1 )
なお、ftanθとfsinθの内分モデル[Bakstein 02]でも同様のことができるが、θが大きいとftanθの影響が強くなりすぎて、モデルとしてあまりよくない気がする
r = f * k1 * ( ( k2 ) * tan ( θ / k1 ) + ( 1 - k2 ) * sin ( θ / k1 ) )
以下の図はレンズによる座標変換を L(θ,k) と表現した場合の三次元座標からカメラ座標までの変換の模式図である。内部パラメータ外部パラメータについては以下で説明する。
Internal Parameters
普通のカメラと同じ。焦点距離 f、アスペクト比 a、非直交歪み s、画像主点(u0, v0)の5パラメータを考えればよい。アフィン変換で表現できる。
| u | | af sf u0 || x | | v | = | 1 f v0 || y | | 1 | | 0 0 1 || 1 |
Lens Distortion
放射歪曲(Radial Distortion)と偏心歪曲(Decentering Distortion)、薄プリズム(Thin Prism)などがモデル化されており、理想的なレンズモデルからの歪みを多項式で表現する。内部パラメータで画像主点を動かすことと偏心歪曲のパラメータをいじることが近いらしく、通常の中心射影レンズでは放射歪曲のみを考えるようだ。つまり、以下に記す式を使えば L(θ,k) * Rad が歪みを考慮したモデルとして採用される場合が多い。なお、レンズモデル自体をパラメータで選択できるようにモデリングした場合、ある種の歪みはレンズパラメータでも表現されうるため考慮しなくてもいいかもしれない。あらかじめレンズモデルがわかっているなら多項式による歪曲の表現は有用だろう。表式の統一性から、fθレンズの場合は特に多項式を使うのが向いているように思われる。
放射歪曲
Rad = 1 + k1 r^2 + k2 r^4 + ...
偏心歪曲
Dec_x = r^2 ( p1 (1 + 2 cos(phi)^2) + 2 p2 sin(phi) cos(phi) ) ( 1 + p3 r^2 + p4 r^4 + ... ) Dec_y = r^2 ( p2 (1 + 2 sin(phi)^2) + 2 p1 sin(phi) cos(phi) ) ( 1 + p3 r^2 + p4 r^4 + ... )
偏心歪曲のモデルがどうしてこうなのか、[Brown 66]を読んでみたいが手に入らない。。
External Parameters
カメラ座標系と物体座標系の変換パラメータ。最初に物体座標系で回転させて直交軸の向きを合わせ、そのあと並進をすると考える。回転3自由度、並進 3自由度の計6自由度がある。回転の表し方はいくらかある。詳しくはWikipediaの Euler角のページにて。
http://en.wikipedia.org/wiki/Euler_angles
直交座標
| X' | | r11 r12 r13 -Xc || X | | Y' | = | r21 r22 r23 -Yc || Y | | Z' | | r31 r32 r33 -Zc || Z | | 1 | | 0 0 0 1 || 1 | | cosγ -sinγ 0 0 || 1 0 0 0 || cosα -sinα 0 0 || X | | Xc | = | sinγ cosγ 0 0 || 0 cosβ -sinβ 0 || sinα cosα 0 0 || Y | + | Yc | | 0 0 1 0 || 0 sinβ cosβ 0 || 0 0 1 0 || Z | | Zc | | 0 0 0 1 || 0 0 0 1 || 0 0 0 1 || 1 | | 1 |
球座標への射影
θ = arctan[(X'+Y')^(1/2) / Z'] φ = arctan[Y'/X']
なお、最初から極座標系で考えようとしてはいけない。極座標系で並進を表現するとものすごい煩雑な式になる
Calibration Algorithms
一般にClosed form solutionで何らかの解析的な解を求め、それを初期値としてバンドル調整することで精度を上げる2段階のアルゴリズムが用いられるようだ。
- Closed form solution
- 拘束式を組み立て、解析的に得られる解、またはそうやって解を得ること。どういった拘束式を作るかは手法によるが、例えばZhangの手法では射影変換行列の間で保存される正規直交基底が満たすべき条件から線形拘束式を組み立てている。
- バンドル調整 (光束調整)
- パラメータから予測される点の位置と、実際に画像上で観測された点の位置の二乗誤差を最小化することでパラメータを数値的に求める事。非線形なのでGauss-Newton法や Levenberg-Marquardt法が使われている。拘束条件がある場合はLagrange未定乗数法を使うことで解を求めやすくなる。
E(θ) = Σ | u - u(θ) |^2
Implementation
いろいろな実装手段がある。格子点の自動検出はOpenCVまたはMATLABのToolboxを使うのがよさそうだ。バンドル調整にはMATLABかlevmarあたりが使いやすいと思われる。
- OpenCV
- Zhangの手法を実装したもの。Zhangの手法では、透視投影モデルでは3次元上の平面の移動が射影変換により表現されることを利用し、複数の平面の射影変換パラメータを使って内部パラメータを計算する。
- 魚眼では平面の移動が射影変換で表現できないので、当然そのままでは使えない
- ただし強力な格子点検出関数が用意されているので、これはぜひとも使おう
- Camera Calibration Toolbox for MATLAB
- OpenCVのキャリブレーションの開発元?のMATLABキャリブレーションツール。魚眼はftanθレンズに多項式を加えたレンズモデルでしか表現してない。というか魚眼レンズ用は開発途上っぽい。せっかく格子点検出も実装してるので、使えたら便利なのに。
- MATLABを使うならlsqnonlinのような汎用の非線形最小二乗を使って素直に実装するのが良さそうだ。
- sba: Sparse Bundle Adjustment
- LAPACKを使って、バンドル調整をLM法により実装しているもの。使っている人は結構いるようだ。投影モデルを好きに選べるのはよいが、問題はもともとがキャリブレーション用のバンドル調整ではないこと。このため内部パラメータの扱いが非常に限定的。
- levmar: : Levenberg-Marquardt法のC/C++実装
- sbaの著者が公開している汎用のLevenberg-Marquardt法のC/C++実装。OpenCVと組み合わせると、格子点検出からパラメタ推定まで一つのプログラムで書ける。
- MINPACK
- 汎用の非線形最小二乗用のFORTRANルーチン。高速なLevenberg-Marquardt法が実装されてます。これを使ってバンドル調整を実装することが可能。ただしF2Cのようなツールを使ってFORTRANをCコードに直したりするのはとてもめんどうだし、levmarのほうが使いやすい気がする。どうしてもフリーツールにこだわるのでない限り、使う意味はないかもしれない。
References
Distortion Models and Estimation
- D.C. Brown, "Decentering Distortion of Lenses," Photogrammetric Engineering, vol. 32, no. 3, pp. 444-462, 1966.
- 現在よく使われる偏心歪曲のモデルを、キャリブレーションの文脈で初めて記述したらしい論文。(提案自体は1919にA. Conrady, "Decentering Lens Systems", Monthly Notices of the Royal Astronomical Soc.,vol. 79, pp.384-390, 1919.が最初らしい)歪曲を扱うほとんど全ての論文で参考文献に挙げられてる。読みたいけど簡単に手に入らない。
- Juyang Weng, Paul Cohen, and Marc Herniou, "Camera Calibration with Distortion Models and Accuracy Evaluation," IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 14, No. 10, 1992.
- Radial、Decenteringの他にThin Prismも歪曲モデルとして取り入れ、ステレオ測定のための正確なキャリブレーション手法を提案した論文。Closed formな解き方と非線形最適化の2段階の手法になっている。
http://ieeexplore.ieee.org/xpls/abs_all.jsp?isnumber=4188&arnumber=159901&count=8&index=0
- Rahul Swaminathan and Shree K. Nayar, Nonmetric Calibration of Wide-Angle Lenses and Polycameras
- 歪曲パラメータの推定に較正物体を用いず、直線の歪みを用いるキャリブレーション手法。歪曲モデルとしてはRadialとDecenteringを想定しています。
- Moumen T. El-Melegy and Aly A. Farag, "Nonmetric Lens Distortion Calibration: Closed-form Solutions, Robust Estimation and Model Selection," Proceedings of the Ninth IEEE International Conference on Computer Vision (ICCV 2003) 2-Volume Set.
- 歪曲パラメータの推定にLeast Median of Squares (LMedS)を使い、Closed formなキャリブレーション手法を提案しているもの。歪曲にはRadialとDecenteringをモデリング。未知の歪曲モデル選択を扱っている。
http://lear.inrialpes.fr/people/triggs/events/iccv03/cdrom/iccv03/0554_el-melegy.pdf
Fisheye Lens Model
- Hynek Bakstein and Tomas Pajdla, "Panoramic Mosaicing with a 180 Field of View Lens," Proceedings of the IEEE Workshop on Omnidirectional Workshop, pp. 60-67, IEEE press, June 2002.
- 魚眼コンバージョンレンズをftanθとfsinθレンズの線形結合モデルで表現した論文。実験的にはこれで精度が良かったとのことだが、本当のところはどうなんだろう
- Donald B. Gennery, "Generalized Camera Calibration Including Fish-Eye Lenses," International Journal of Computer Vision, Vol. 68, No. 3, July 2006.
- 歪曲を非常に精緻にモデリング(例えばすべての光線が焦点を通る仮定をしていない)していながら、なぜか魚眼投影レンズはパラメタ1つでモデルを立てているもの。確かにいくつかの魚眼レンズを表現できるものの、もう少しいい式の立て方がありそうな気がする
Others
- Paul Bourke's Projection page
- プラネタリウムを作ったりするときの投影に関して非常に多くの説明がされているページ