Picam360は、パノラマ映像の画像処理に「picam360-capture」というソフトウェアを実装しています。パフォーマンス重視のために、C言語で実装しました。
[実装コンポーネント]
- picam360_capture.c
OpenGLを使用して、パノラマレンダリングをします。 - video.c
OpenMAXを使用して、h264動画をデコードします。 - mjpeg_decoder.cc
OpenMAXを使用して、mjpeg動画をデコードします。 - rtp.c
パケットをRTPプロトコルでストリーミングします。外部コンポーネントも検討しましたが、Raspberry Piで動作させるためにはパフォーマンスに難があり、簡易に内部実装しました。ネットワーク部分をnetcatなどの外部プロセスに移譲することを検討しましたが、こちらもパフォーマンスに難があり、内部に実装しました。
[外部参照コンポーネント]
- OpenMAX
画像や動画のエンコード・デコードなどのメディア処理のオープンインターフェースで、Raspberry Piにもサポートされています。Raspberry PiのOpenMAXを使用したプログラムによく登場する、ilclientは少し移植性に欠けます(他のプラットフォームに移植にトライした時にここでハマりました)。可能であれば、OpenMAX単体の実装がいいと思います。特にilclientを使用したイベントの待ち処理の互換性に難がある印象です。Picam360では、MJPEG,h264のハードウェアエンコード・デコードを行い、テクスチャメモリに転送するところで使用しています。 - OpenGL ES 2.0
プログラマブルシェーダーを利用して、画像処理を行うことができます。Picam360では、3Dオブジェクトのテクスチャマッピングによりパノラマ画像を作成しています。Vertexシェーダで3Dオブジェクト上にマッピングするテクスチャの座標を計算し、Fragmentシェーダで算出された座標から実際のテクスチャ内のピクセル値を取得します。各シェーダーファイルは、「/path-to-picam360-capture/shader/*.vert,*.frag」に配置されています。新規の入出力画像フォーマットに対応する場合で変更が必要となります。 - editline
コマンドラインを扱うためのコンポーネントです。Ctrl+Rで履歴検索が便利です。Picam360でのコマンドライン履歴ファイルは「/path-to-picam360-capture/.picam360_history」に配置されます。
sudo apt-get install libedit-dev
- jansson
jasonファイルを扱うC言語のコンポーネントです。jsonはデータをテキストで簡易に表現できるので扱いが簡単です。Picam360では、設定ファイルでjsonを採用しています。
sudo apt-get install libjansson-dev
[Files]
・source code
・ComponentDiagram