ロハでHDRパノラマ (9): レンズキャリブレーション

撮影した画像は多かれ少なかれ歪んでいる。この歪み (ひずみ)はレンズに起因するもので、何枚写真を撮ろうが変わらない。Huginで歪みを除き、データとして保存すれば、以降、歪みのデータは再利用できる。こういう作業をレンズのキャリブレーション (校正)と呼ぶ。

Huginサイトにレンズキャリブレーションの例がある。Huginでは放射状の歪みa, b, cの校正を行う。このとき必要なコントロールポイントは、写真を継ぎ接ぎするのとは別のモノ。Huginのコントロールポイントタブで、左右に同じ写真を指定し、直線を追加していく。

実際にやってみると解るが、うまくいかない。

コントロールポイントが少ないのか、解が発散してしまう。かと言って、ポチポチポチポチポチポチやってると、イライラするので、楽する方法を考える。どうせ、と言うと、アレだが、手持ち撮影でパノラマする場合、Huginで精緻なレンズキャリブレーションは必要ない。撮影時に生じた視差を誤魔化すのに、こいつら歪みパラメータに吸収させてインチキするから。取りあえずの値があれば良い。また、歪みモデルがシンプル (に見える)なので、画像処理チップでゴリゴリやった後のJPGを喰わせて大丈夫なのか解らない。

なので、今回の目的はパノラマ作成からはちょいと外れる。外れるが、写真見てて、「あー、ビルがヨガんどるなあ、気持ち悪いなあ」てな時に役に立つかもしれない。また、最終的にはHuginでの歪みパラメータを求める。

道具を変える。OpenCVを使う。OpenCVは画像処理ライブラリで、オープンソースとなるとほぼ一択、これしか無い。ライブラリのインストール方法やリファレンスは、奈良の先っぽ大学が日本語化してくれている。

記憶違いかなあ、どこにも大学名書いてない。まいか。そこにサンプルコードがあるので、これを借用してレンズの校正が出来る。サンプルコードは、画像にPNGを使い、ディレクトリ名、ファイル名も固定なので、そこいらをイジると良い。ここで用いられている歪みモデルは大層なもので、産業機械の画像処理などでも利用される。校正の概要は以下のとおり。

  • チュートリアルにあるpdfを使って校正用パターンを印刷する。
  • 様々なアングルでパターンを撮影する。
  • 画像を校正プログラムに喰わせて校正データを保存する。
  • 校正データを使って目的の画像を校正する。


詳しい校正方法は前述のサンプルコードのページを見てもらうとして、結果はこうなる。校正前後の格子パターン。

どうだろ。スッキリするよねえ。次回からは、保存したキャリブレーションのデータ (.xml)で画像の校正が出来る。実際の写真に適用するとこうなる。

OpenCVで格子点を自動検出できるので、その座標も手に入る。次に、この座標を使ってHuginで校正してみる。出力させた座標は下のようになる。

263.481598 243.012711
262.584747 368.551422
262.679016 496.238312
263.755066 621.987549
265.772705 746.796814
267.632324 871.507080
269.662903 993.696777
386.307953 240.787094
385.534485 367.418274
385.717834 495.945221
386.527771 622.631592
388.616974 748.195496
...


これをHuginの保存ファイルに持っていく。画像を一枚だけ登録し、ダミーのコントロールポイントを追加してプロジェクトを保存し、プロジェクトファイル (.pto)をエディタで編集する。行頭が"c"で始まるのがコントロールポイント。行末の"t%d"が直線番号で、3から始まる。編集には矩形の切り貼り、キーボードマクロが可能なものが必須だ。

# hugin project file
#hugin_ptoversion 2
p f0 w987 h1228 v68  E8.22211 R0 n"TIFF c:NONE r:CROP"
m g1 i0 f0 m2 p0.00784314

# image lines
#-hugin  cropFactor=4.66688
i w1600 h1200 f0 Eb1 Eev8.52160036448132 Er1 Ra-3.10594797134399 Rb-1.38925492763519 Rc0.509779691696167 Rd-0.438865065574646 Re0.521465837955475 Va1 Vb-1.01982193476752 Vc-0.315680147451513 Vd0.392935307864415 Vx0 Vy0 a0.267569860143675 b-0.474125475323547 c0 d0 e0 g0 p1.65953642602209 r0.46874510152735 t0 v63.437655269117 y-0.323981317980261  Vm5 u10 n"IMG_1363.JPG"


# specify variables that should be optimized
v a0 b0 c0 
v 

# control points
c n0 N0 x263.481598 y243.012711 X262.584747 Y368.551422 t3
c n0 N0 x262.584747 y368.551422 X262.679016 Y496.238312 t3
c n0 N0 x262.679016 y496.238312 X263.755066 Y621.987549 t3
c n0 N0 x263.755066 y621.987549 X265.772705 Y746.796814 t3
c n0 N0 x265.772705 y746.796814 X267.632324 Y871.507080 t3
c n0 N0 x267.632324 y871.507080 X269.662903 Y993.696777 t3
c n0 N0 x269.662903 y993.696777 X263.481598 Y243.012711 t3
c n0 N0 x386.307953 y240.787094 X385.534485 Y367.418274 t4
c n0 N0 x385.534485 y367.418274 X385.717834 Y495.945221 t4
c n0 N0 x385.717834 y495.945221 X386.527771 Y622.631592 t4
c n0 N0 x386.527771 y622.631592 X388.616974 Y748.195496 t4
c n0 N0 x388.616974 y748.195496 X390.372162 Y873.523376 t4
c n0 N0 x390.372162 y873.523376 X391.376373 Y995.972534 t4
c n0 N0 x391.376373 y995.972534 X386.307953 Y240.787094 t4
c n0 N0 x509.269348 y239.555374 X509.013336 Y366.735199 t5
c n0 N0 x509.013336 y366.735199 X509.203217 Y496.295197 t5
c n0 N0 x509.203217 y496.295197 X509.921021 Y623.706726 t5
c n0 N0 x509.921021 y623.706726 X511.297638 Y749.708984 t5
c n0 N0 x511.297638 y749.708984 X512.461487 Y875.237427 t5
c n0 N0 x512.461487 y875.237427 X513.858093 Y997.556702 t5
c n0 N0 x513.858093 y997.556702 X509.269348 Y239.555374 t5
c n0 N0 x636.436523 y238.230072 X636.385864 Y366.406708 t6
c n0 N0 x636.385864 y366.406708 X636.492004 Y496.141113 t6
c n0 N0 x636.492004 y496.141113 X636.705322 Y624.230713 t6
c n0 N0 x636.705322 y624.230713 X637.519653 Y750.498657 t6
...


要は、横一列、縦一列に並んだ点を、ズラッと並べて同じ直線上に置いていく。先の格子だと7x10のコントロールポイントがあるので、直線は17本できる。プロジェクトファイルをHuginで読み直し、コントロールポイントを確認し、チュートリアルに従うとこうなる。

コントロールポイントが外周部に無かったためか、外周の矩形に歪みが若干残っているのが解る。どえらい廻り道だったが、ワシの愛機、Powershot S95の歪みに関して、Huginではとりあえず下の値を使えば良いことになる。

a = -0.015, b = 0.021, c = -0.031


同じ型のカメラであれば、上のa, b, cを取りあえずとしてやれば、コントロールポイントを手作業で設置して、その数が少なくても解が収束するかもしれない。

関連する記事

OpenCVとは編集