OpenCVの魚眼カメラの表現を図解する

OpenCV魚眼カメラの投影モデルは以下のページの「Detailed Description」で説明されている。
OpenCV: Fisheye camera model

個人的には図がないとピンとこないので、図解してみつつ何をやっているのかを確認した。

計算の流れは上記の図の右から左に向かって以下の手順で行う。

  1. 3Dから2Dへの投影のために、カメラ座標  (Xc, Yc, Zc)を同次座標である (a, b, 1) = (Xc/Zc, Yc/Zc, 1)とおく。これは歪のない点である。
  2.  (a, b, 1)からZ軸におろした垂線の長さを rとすると r^2 = a^2 + b^2である。
  3. Z軸と(a, b, 1)が成す角度を \thetaとすると \theta = atan(r)である。(90度付近の扱いはどうするんだろう)
  4.  rと対になる画像平面での高さ(像高)を \theta{d}として、 \thetaをつかって \theta{d} k1〜k4の係数で多項式近似された値を求める。(係数はキャリブレーションのときに求められたものを使う)
  5.  x', y' \theta{d} rの比率を a, bにかけて計算される。 x', y'は歪が付加された点だ。

ややこしいのは \theta{d} \thetaとは異なり、Z軸と座標点の成す角度ではなく像高であることだ。おそらく気持ち的には像高を円の弧の長さとして表現しているんだと思うけど。

とりあえず図解したことで理解が深まったので良しとする。