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変換すると手前が小さく、奥が引き伸ばしになるので最後の絵のように、手前のバイクは小さく、奥の人が巨人になってしまう。