新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

魚眼レンズの画像を補正

http://www.xylon.jp

にも書いたが、魚眼レンズでつくられたひずんだ画像をリアルタイムに補正・修正するキットを作った。絵がなさけない。PC 用のキャリブレーション・ソフトもあるのでオール・イン・ワンだ。このキットのいいところは実行時には PC を必要としないところ(キャリブレーション時にのみ PC が必要)。あまりにも最先端を行き過ぎていて”何をやっているのかわからない”のが難点か、、、。世の中は PC を使ったほうが説得力があるようだ。そして PC が必要ないことに驚く人もあまりいない。

どういう構造になっているかというと、まず、魚眼レンズが結ぶ画像を CCD センサが捕らえる。使っている魚眼レンズは 180 度の画角なのだが、 CCD が小さいのでおおよそ 160 度の画角になってしまっている。これは CCD センサーの大きさの問題なので魚眼レンズを適切なものを選ぶか、それとも CCD センサーのサイズを大きくするかすれば解決する。CCD センサーは LVDS でベイヤー・パターンにより画像データをシリアル転送する。入力が RGB (DVI-D とか)でないところがこれまたみそだ。

入力の FPGA ボードは LVDS から情報を受けてカラー情報を再構築し VRAM へ転送する。このとき、VRAM へ直接書くことも出来るが、複数バッファを持ち、VRAM は一生懸命外の LCD に出力しているのを邪魔せずにちゃんと同期を取り画像が乱れないようにすることができる。

ここまでだとただの画像入力ボードだ。それだけでも LVDS とベイヤー・パターンに対応しているという意味で十分価値がある。蛇足だが CCD センサーとは I2C で繋がっているのでそのコントロールも出来る。

さて、モードを変えると今度はベイヤー・パターンで作られた情報は VRAM には書き出さずに補正モジュールに入る。ここで魚眼レンズでつくられたひずんだ画像を補正する。補正パターンはあらかじめ FPGAVHDL としてハードコーディングすることが出来(これはスイッチオンですぐにそのパターンに対応されるので便利)、更に後でソフト的に補正の為の値を特定のレジスタに与えてやれば、その補正パターンを変えることが出来る。もしソフト的に後から補正することがないのであれば FPGA なので、合成時にその旨を伝えてやると使用する LUT などの資源を減らすことが出来る。

補正モジュールは自身は中間的に VRAM を必要としない。また SPARTAN-3E XC3S1200E で動作する。これはDSP48がなくても動作することを意味する。最終的に補正されたデータは VRAM へ転送される。VRAM 転送時には直接書くことも出来るが、クアドロ・バッファー(4つのバッファ)を使って表示の乱れがないように転送することも可能だ。

クアドロといえば4枚歯か?いや68040のマックか?

表示の乱れについては大牧さんの記事(インターフェース2009年8月号)がわかりやすい。
http://www.kumikomi.net/interface/sample/200908/if08_083.pdf