web-dev-qa-db-ja.com

OpenCV出力をVLCストリームに送信する

これは午後のかなりの部分で私を忙しくさせていて、私はそれを働かせることができませんでした、しかし私は本当に近くにいるように感じます。

ウェブカメラからビデオフィードを取得するopenCVをセットアップしました。このビデオフィードに(openCVオーバーレイを使用して)アクセスできるようにするには、openCV pythonスクリプトの出力をVLCストリームにパイプします。ストリームを起動して実行し、接続できます。 VLCは正しいアスペクト比と解像度にサイズ変更されるため、正しいデータが取得されますが、取得される画像はJitter;です。

python opencv.py | cvlc --demux=rawvideo --rawvid-fps=30 --rawvid-width=320 --rawvid-height=240  --rawvid-chroma=RV24 - --sout "#transcode{vcodec=h264,vb=200,fps=30,width=320,height=240}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=:8081/stream.flv}" &

スクリプトの出力は、次のようにstdoutに送信される一定のビデオフィードです。

from imutils.video import WebcamVideoStream

vs = WebcamVideoStream(src=0)

while True: 
  frame = vs.read()
  sys.stdout.write(frame.tostring())

上記の例は、私が使用しているスクリプトのダムダウンバージョンです。また、見られるように、私はimutilsライブラリを利用しています。 https://github.com/jrosebr1/imutils

誰かが私に正しい方向にナッジを与えることができれば、私はそれを大いに感謝します。私の推測では、stdout.write(frame.tostring())はvlcが期待するものではありませんが、自分で理解することはできませんでした。

14
Nicky Romeijn

以下はPython 3の下で私のために働きます

import numpy as np
import sys
import cv2

cap = cv2.VideoCapture(0)

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:        
        sys.stdout.buffer.write(frame.tobytes())
    else:
        break

cap.release()

そして、コマンドライン(私のウェブカメラの解像度は異なり、結果のみを表示しますが、問題はありませんでした)

python opencv.py | vlc --demux=rawvideo --rawvid-fps=25 --rawvid-width=640 --rawvid-height=480 --rawvid-chroma=RV24 - --sout "#display" 

もちろん、これにはBGRからRGBへの変換が必要です。前者はOpenCVのデフォルトです。

1
Atnas

私はRTSPストリームに送信していて、imutilsライブラリを使用していませんが、これは私にとってはうまくいきました:

import numpy as np
import sys
import cv2

input_rtsp = "rtsp://10.10.10.9:8080"
cap = cv2.VideoCapture(input_rtsp)

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:        
        sys.stdout.write(frame.tostring())
    else:
        break

cap.release()

次に、コマンドラインで:

python opencv.py | cvlc --demux=rawvideo --rawvid-fps=25 --rawvid-width=1280 --rawvid-height=720  --rawvid-chroma=RV24 - --sout "#transcode{vcodec=h264,vb=200,fps=25,width=1280,height=720}:rtp{dst=10.10.10.10,port=8081,sdp=rtsp://10.10.10.10:8081/test.sdp}"

OpencvBGRをRGBに変換する必要がないことに注意してください。

1
sbond