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)
autovideosink
を videoconvert ! 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
を指定すると、画像が乱れてまともに表示されませんでした。