プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2021/11/17

OpenCV + Gstreamer を使う

event_note2021/11/17 0:15

OpenCV で GStreamer を使うための Docker コンテナを作成したので、GStreamer を使ってカメラの画像を取得するところまで試してみました。

Docker コンテナの作成については以下の記事に書いています。

GStreamer の基本

私は Gstreamer を今回初めて使いました。
最初、GStreamer のことが全然分からず困っていたのですが、以下の記事がとても参考になりました。

GStreamer の動作確認

OpenCV を使う前に、まずは GStreamer が使えるかどうか単体で試します。

ネットワークカメラから RTSP で画像を取得して表示します。
今回は Panasonic のカメラを使いました。

Docker コンテナ内で以下のコマンドを実行するとウィンドウが立ち上がり、カメラの画像が表示されれば OK です。

gst-launch-1.0 rtspsrc location=rtsp://username:password@host/MediaInput/h265 ! decodebin ! autovideosink

decodebin でデコードし、autovideosink 自動表示(画面上にウィンドウで表示)する感じみたいです。

OpenCV を使う

上記を踏まえ、OpenCV で GStreamer のクエリを指定する場合は、以下のように記述します。

query = 'rtspsrc location=rtsp://username:password@host/MediaInput/h265 ! decodebin ! videoconvert ! appsink'
cap = cv2.VideoCapture(query, cv2.CAP_GSTREAMER)

autovideosinkvideoconvert ! appsink に変更しています。
GStreamer の出力を OpenCV に入力するためには appsink が必要みたいです。
んで、appsink に送るためには videoconvert が必要みたいです。
これで cap.read() をコールすれば、フレームデータを取得できます。

ただし、このままだと遅延が酷かったので、latency=0 を追加しました。

query = 'rtspsrc location=rtsp://username:password@host/MediaInput/h265 latency=0 ! decodebin ! videoconvert ! appsink'
cap = cv2.VideoCapture(query, cv2.CAP_GSTREAMER)

とりあえずはこれで動作確認できました。

ちなみに、OpenCV を使わずにコンソールで gst-launch-1.0 で直接実行する際に latency=0 を指定すると、画像が乱れてまともに表示されませんでした。