ロハで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を取りあえずとしてやれば、コントロールポイントを手作業で設置して、その数が少なくても解が収束するかもしれない。
関連する記事
- ロハでHDRパノラマ (1)
- ロハでHDRパノラマ (2): ジオタグの埋め込み
- ロハでHDRパノラマ (3): HDR合成とトーンマッピング
- ロハでHDRパノラマ (4): パノラマ作成・概要
- ロハでHDRパノラマ (5): パノラマ撮影のコツ
- ロハでHDRパノラマ (6): Hugin、コントロールポイント
- ロハでHDRパノラマ (7): 散歩マップでニヤニヤ
- ロハでHDRパノラマ (8): HDRの味付け
- ロハでHDRパノラマ (9): レンズキャリブレーション
- ロハでHDRパノラマ (10): Huginの問題点
- ロハでHDRパノラマ (11): パノラマ作成時のHDR合成
- ロハでHDRパノラマ (12): 浮動小数点階調画像の取扱い、失敗
- ロハでHDRパノラマ (13): 浮動小数点階調画像の取扱い、かろうじて成功
- ロハでHDRパノラマ (14): Fake HDRって?
- ロハでHDRパノラマ (15): 上手にできた例・ミッドタウンガーデン
- ロハでHDRパノラマ (16): トーンマッピングパラメータ
- ロハでHDRパノラマ (17): 動体除去
- ロハでHDRパノラマ (18): レンズキャリブレーション、スクリプトで
- ロハでHDRパノラマ (19): HuginでHDR出力
- ロハでHDRパノラマ (20): RAW一発からのHDR・階調データの確認
- ロハでHDRパノラマ (21): RAW一発からのHDR・HDR合成まで
- ロハでHDRパノラマ (22): RAW一発からのHDR・トーンマッピング - ぽこにっき
- Intel Open Source Computer Vision Library の略。米 Intel 社で開発された画像処理・画像認識用のC言語ライブラリ。オープンソースであり、商用・非商用を問わず無料で使用できる。静止画にも動画にも対応しているため、特にロボット工学やバイオメトリク.. 続きを読む
- http://sourceforge.net/projects/opencvlibrary/ sourceforge.net
- このキーワードを含むブログを見る