ひでみのアイデア帳

くだらないことなんだけど、忘れないために・・・

Top View

Top ViewをFPGA化してみましょう。

もちろん、Top Viewに必要な部分だけFPGA化してみます。

結論から言うと、Top Viewで必要なのはFPGA化が必要なのはReMapだけです。

高速にReMapするのだけはFPGAにさせたほうがいいです。

ReMapって、単にメモリの置き換えですね。

ReMapデータの生成方法

まずは下のような絵があったとする。

本当は広域に撮りたいので160度以上の魚眼カメラを使いたいところだが、手元にないのでサンプル画像はスマホのカメラを使用している。

最初にしなければいけないのはカメラレンズの歪み補正。

元絵のチェスボードから下の絵のように頂点を切り出す。

それをOpenCVでcvCalibrateCamera2()とかすると歪み補正用の係数ができて、cvInitUndistortMap()⇒cvRemap()すると下の絵のように補正される。

切り出した頂点のところがなんとなく、まっすぐになった気がする。

ただ、撮影した時は紙が反ってしまっていたので、魚眼カメラの逆の結果になってしまったが・・・(^-^;

次に歪み補正した状態でカメラを斜めに設置します。

斜めに設置して、絵を撮ると下のようになる。

床においているチェスボードは斜めから撮っているカメラからすると当然、近くが広く、奥が小さい台形になる。

この状態でチェスボードの頂点を切り出す。

下の絵のように・・・

周りがどんな風に見えるか、車や人を設置してみた。

これで左上、左下、右下、右上の各座標位置を取得して、cvGetPerspectiveTransform()⇒cvWarpPerspective()すると下の絵のように上から見た絵に変換できる。

ほら、これでカメラ1つ分のTop Viewができました。

4つ繋げればXylonのデモのようなことすぐできるでしょ。

データ自体はcvInitUndistortMap()ではMapデータ、cvGetPerspectiveTransform()では3x3の行列ができます。

両方を掛けあわせて、最初の絵から最後のTop Viewまで変換するMapデータを作れば、歪み補正+透視投影を行ってTop View変換ができる。

Mapデータさえ出来てしまえば、FPGAで実現するのはDMA転送だけ。

DMA転送なんて、どうってことないので簡単でしょ。

Top View変換すると手前が小さく、奥が引き伸ばしになるので最後の絵のように、手前のバイクは小さく、奥の人が巨人になってしまう。