1120 文字
6 分
内部パラメータ(焦点距離)の単位の話 ~pixelとmmの変換~
2018-02-24
2019-07-28

さて、今回は内部パラメータの単位について解説してみたいと思います。

皆さんご存知の通り、透視投影変換は

世界座標

カメラ座標

画像座標

の順で、世界座標を画像座標に変換していて、現実世界の3次元物体が画像上のどこに投影されるのかを示したものでした。

ただ、ちょっと考えてみてください。
世界座標系やカメラ座標系、すなわち現実世界では物体の大きさはメートルとかセンチメートルとかミリメートルで表しますよね。

一方で、画像座標系では投影された物体の大きさはピクセル単位。。。
あれ、いつの間にか単位が変わっちゃってますね!びっくりです。

画像

どこで変わっちゃったんでしょう。
ずばり、カメラ座標から画像座標に変換されるときです。

内部パラメータに秘密があるんです。内部パラメータは覚えていますか?
覚えていない人はまずはこちらで思い出しましょう。

内部パラメータ行列はこんな形をしていましたね。
(fx,fy)(f_{x}, f_{y})は焦点距離、(cx,cy)(c_{x}, c_{y})が光学中心です。

画像

で、実はこの焦点距離と光学中心、全部ピクセル単位なんですよ!
焦点距離の単位は一般的にはmmmmなんですが、透視投影変換の式の焦点距離はピクセルなのです。

ちょっと待て、mmmmとピクセルってどうやって変換するんだよ
とか
ピクセル単位なのは分かったけど、なんでfxf_{x}fyf_{y}の2種類も焦点距離があるんだよ
っていう声が聞こえてきそうなので、順に説明していきます。

まずは、イメージセンサについて説明します。

そもそも、カメラはイメージセンサというセンサに光を通すことで、現実の風景を画像に変換しています。
で、このセンサは画素数分の受光素子(フォトダイオード)を設置したセンサなんです。

例えば、下のような14×8ピクセルの画像を撮影できるカメラには、縦14個、横8個の受光素子が設置されています。

つまり、

1ピクセルのmm単位の大きさ=イメージセンサの1辺の長さ1辺の受光素子数1ピクセルのmm単位の大きさ=\frac{イメージセンサの1辺の長さ}{1辺の受光素子数}

が成り立つんです。

これがわかれば、焦点距離のmmmm⇔ピクセルの変換は余裕ですね!

さて、理想的には

イメージセンサの縦の長さ縦の受光素子数=イメージセンサの横の長さ横の受光素子数\frac{イメージセンサの縦の長さ}{縦の受光素子数}=\frac{イメージセンサの横の長さ}{横の受光素子数}

が成り立つはずなんですが、悲しいかな人間の作った工業製品、微妙に成り立たないんだなこれが。。。

しょうがないから横軸xx軸の焦点距離と縦軸yy軸の焦点距離を別々に考えようってなったのが、fxf_xfyf_yです。すなわち、

fx=横の受光素子数イメージセンサの横の長さ×mm単位の焦点距離f_x=\frac{横の受光素子数}{イメージセンサの横の長さ}\times mm単位の焦点距離 fy=縦の受光素子数イメージセンサの縦の長さ×mm単位の焦点距離f_y=\frac{縦の受光素子数}{イメージセンサの縦の長さ}\times mm単位の焦点距離

ということですね。

まあ、ぶっちゃけ最近のイメージセンサは精度がいいので、fx=fyf_x=f_yと考えてもほとんど支障ありません。(精度を求める研究をしている人はちゃんと気にしましょう)

余談ですが、バンドル調整とかで内部パラメータを非線形最適化するときは、fx=fyf_x=f_yとして扱った方が未知数が減ってむしろ精度が安定する気がします。(検証はしていません)

技術書でもこの辺の話題は触れられなかったり軽く流されたりで、初学者の学生さんなんかは勘違いしている人結構いるんじゃないでしょうか?
(私は学生時代勘違いしていましたw)

この記事では主にmmとpixel単位の変換の考え方について書きましたが、実際にJPEGのメタデータであるExifから、ピクセル単位の焦点距離を導出する方法を以下の記事にまとめました。