動画像関係の処理をする際に、GStreamer もしくはNVIDIA DeepStream という枠組みを使うという選択肢もある。
- カメラから画像を読む。
- 画像を縮小する。
- 物体検出をする。
- 検出結果を表示する。 これらが1つのプログラムの中で呼び出されます。
- その言語、そのライブラリの範囲でのマルチスレッド化の対応。
- そのプログラムの中で、それぞれのデータを管理しなくちゃならない。
- プログラムが巨大化しがち。
- メンテナンスが難しくなりやすい。
- 画像の入力・出力を切り替えるのはおおごとである。
- 例:「16台の監視カメラ入力のそれぞれに対して検出・追跡処理をして、描画結果を4x4に配置してモニタに表示させる」
- このようなアプリケーションをC++やPythonで1つのアプリケーションとして作るのは得策ではない。
- H.264のビデオ信号のdecode などを必要とするだろうし、4x4の16台が5x6の30台に置き換わるかもしれない。
- それらを1つの言語で記述してリンクして動作させることが簡単ではなくなってくる。
- 上記の1から4の処理がパイプラインとして別々のプログラムして動作する。
- それぞれが別のプロセスであるので、マルチコアの性能を引き出しやすい。
- 処理が、エレメントという単位に分割される。
- エレメントをパイプ "!" で連結することができるので、巨大な処理を1つに記述しなくて済む。
- かなりのエレメントは、既存のエレメントを流用すればよい。
- 自作する必要のあるエレメントは、既に入力と出力が単純化されているので、自作部分を単純化できる。
- GStreamerとは
- gstreamer備忘録
$ gst-launch-1.0 videotestsrc ! autovideosink
のような使い方をする。 - RustでGStreamer Pluginを書く
"tcambin ! videoconvert ! ximagesink" このように "!" でパイプとして、それぞれのエレメントをつないで処理をおこなうことができる。