読者です 読者をやめる 読者になる 読者になる

魚眼レンズを使用した写真の補正

たたききゅうりとP2Pにはまってるmashです、こんにちは。

2008年夏、由比ガ浜海水浴場オフィシャルサイト 由比ガ浜.comのトップページで、 画角180度の魚眼レンズを使用して、由比ガ浜のパノラマ画像を配信していました。 現在は思い出ムービーとしてその記録をご覧いただけます。

その画像変換部分を担当しましたので軽くご紹介いたします。

使用した魚眼レンズは、デジタルフィッシュアイコンバージョンKDF-025

魚眼レンズをカメラの前面にとりつけて写真を取ると、 こんな画像になります(カヤックの私の机です) inputimage

結論から言いますと、以下のように解像度が落ちない範囲で切り取り&座標変換を行います。 outputimage

中心から外へいくほど解像度が落ちていることがわかります。 由比ガ浜のパノラマ画像をクライアントのFlashに配信する時に、どこでこの変換を行うか。

FlashのDisplacementMapFilterを使用する方法もありますが、 ウェブカムから配信されたストリーミング映像には適用できないのと、 そこそこ見える画像にするため、解像度の高いまま画像をクライアントに渡すとFlashが重くなりますので、 配信側で加工することにしました。

変換にはPanotoolsを使用し、 パラメータの決定にはPTGuiを使いました。 Panotoolsは、PANORAMA TOOLSに紹介されています写真のような ばらばらの写真をstitch(つなぎ合わせ)、一枚の連続したパノラマ写真を生成するため等に使用できる、画像処理ライブラリ集です。

PTGuiはそのフロントエンド。Panotoolsに渡すパラメータを導くためのみに使います。

PTGuiを起動し、画像を読み込みます。 Lens typeはCircular, Horizontal Field of Viewは180度。

ptgui1

有効画素の範囲をcropし、

ptgui2

Rectlinearに投影した時に、視野角の中心から何度までを使用するか、確認しながら調整します。

ptgui3

それぞれの画面の数値を PanotoolsのPTSticherの設定ファイルに落とし込むと、以下のようになります。

# 出力は800x800,rectilinear,視野角150度のJPG(圧縮率100) 
p w800 h800 n"JPEG q100" f0 v150

# 入力はCircular FishEye, Roll角補正0度, Pitch角補正0度, 水平視野角160度, C**の方形内の画素を使用する
o f2 r0 p0 y0 v160 C391,2291,423,2323

# 補間式はsinc1024を使用
m i7 f0

設定ファイルをoptions.txtとし、同じフォルダにpano12.dllを置いた状態で以下のように変換処理を実行できます。

PTStitcher.exe -o outputimage options.txt inputimage.jpg

魚眼レンズ楽しいですよ!何かのきっかけになれば幸いです。 enjoy!

カヤックでは画像処理やP2Pが得意な技術者を募集しています!