6. カメラ画像を3D表示

カメラはOpenCV,表示はOpenGL+glutで

一つ前の記事では表示もOpenCVを使いましたが, 表示にOpenGL+glutを使うと3Dの扱いが容易になります. カメラ入力はOpenCV,3D出力はOpenGL+glutのプログラム camera_3d_glut.cpp を用意しました. できるだけ行数が少なくてちゃんと動く例から始めるのが一番です. このプログラムは113行しかありませんから簡単に全体を読めると思います.これと makefile をダウンロードして同じディレクトリに置いて

make glut
とするとカメラの画像が3D空間の平面としてビデオ表示されます.
  • qキー:終了
  • hキー:より左から見る
  • jキー:より下から見る
  • kキー:より上から見る
  • lキー:より右から見る
  • fキー:より遠くから見る
  • nキー:より近くから見る
のキー操作が可能です.

カメラはOpenCV,表示はOpenGL+glut+glewで

最初の例のOpenGL+glutの部分は,描画にGPUが使われていなかった時代の,古い書き方になっています. このような書き方はいずれ使えなくなるようです. 新しい書き方では,描画データの生成と描画を分けて書きます.用意した camera_3d_glew.cpp ではGL_ARRAY_BUFFERを使ってこの分離を行っています. idle()関数の中で,カメラ入力のすぐ後で,描画データの生成を行い, 描画そのものはdisplay()関数の中のglDrawArrays()で行っています. 147行に増えましたが, diffでcamera_3d_glut.cppとの差分をとってみるとどう変わったのかが良く分かると思います. 先ほどのmakefileを使って

make glew
とすると, 最初の例と同様にカメラの画像が3D空間の平面としてビデオ表示されます.キー操作も同じです.

カメラはOpenCV,表示はOpenGL+glut+glewをCUDAで

最後の例は描画データの生成をGPU+CUDAで行うというものです. 最近はAIで有名になった米国NVIDIA社が開発した並列処理言語環境がCUDAです. パソコンにNVIDIA社のGPU,例えばGTX660, GTX1080, etc.,が付いているならCUDAを使わない手はありません. 全体で195行の camera_3d_cuda.cu を用意しました.今度は

make cuda
です.機能は前の二つと同じです.camera_3d_glew.cppとの差分をとってみるとどう変わったのかが良く分かると思います. display()関数の中の描画部分は全く変更されていません. バッファの割り当て方と描画データの生成の部分が異なっています. idle()関数の中の picture<<< ((XX*YY)/TD_NUM)+1, TD_NUM >>>(pos); でXX*YY個=640*480個のスレッドを一斉に起動して並列動作させて描画データを生成しています. またカメラからのデータをGPU側に転送しておくためにFRM配列を使っています.

まとめ

最後の例まで分かると,アイデア次第で様々なものを作り出すことができます. いったんコンパクトで内容が理解できている動く例を手に入れたなら, OpenCVやOpenGLやCUDAの知らない機能をどんどん試して自分のものにしていくことができます. また,ここまでちゃんと動けばOpenCVとOpenGLとCUDAがちゃんとインストールされていることになります.