Fisheye Camera Calibration

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) と表現した場合の三次元座標からカメラ座標までの変換の模式図である。内部パラメータ外部パラメータについては以下で説明する。

fisheye_projection.png

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段階のアルゴリズムが用いられるようだ。

E(θ) = Σ | u - u(θ) |^2

Implementation

いろいろな実装手段がある。格子点の自動検出はOpenCVまたはMATLABのToolboxを使うのがよさそうだ。バンドル調整にはMATLABかlevmarあたりが使いやすいと思われる。

References

Distortion Models and Estimation

Fisheye Lens Model

Others

FisheyeCalibration (last edited 2009-07-09 19:16:09 by KotaYamaguchi)