ピンホールカメラモデルのモデルパラメータである内部パラメータは、様々な形式で記述されるが 画角と解像度だけが分かっている場合に、どのようにOpenCVなどで用いられる内部パラメータ行列(camera matrix)を構成すればよいか解説する。
画角はカメラが映す範囲を直接角度として測ることができるので 画角だけがおおよそ分かっておりスペック等から解像度だけが 知り得る内部パラメータに関係する情報である場合が時々ある。 主点は画像のど真ん中、アスペクト比は1:1だとして、 このような場合、内部パラメータ行列はどのように設定すれば良いのか?
- $X$, $Y$, $Z$: シーン点のカメラ座標
- $f$: 焦点距離
- $U$, $V$: シーン点の画像上の座標 [mm]
- $u$, $v$: シーン点の画像上の座標 [pixel]
- $w$, $h$: 撮像素子の画素数
- $W$, $H$: 撮像素子のサイズ
ピンホールカメラにおける透視投影変換といえば
教科書などでは大抵次のような式が登場する。
mm単位での撮像素子のサイズ$W$と撮像素子の画素数$w$の比から
画素単位の画像上の座標$u$次の様に書ける。
ここで画角$\theta$がわかっていれば$\tan\theta=\frac{W/2}{f}$と書けるので、
次式のように書け、この$\tan\theta$こそがOpenCVなどの内部パラメータ行列の要素として登場する$f_x$に相当することが分かる。
上の図は画像の水平方向のみのものだけど,もう一方も同様になる.
ここで$w:h=W:H$なので$\frac{h}{H}=\frac{w}{W}$であり
と,水平方向と同じになる.画像の左上が原点だとすると結局内部パラメータ行列$K$は次のようになる。