2016-09-13 31 views
0

OpenCVを初めて使用しています。私はUDPポートでビデオストリームにアクセスするプログラムを作成しようとしています。しかし、コードは実行時にセグメンテーション違反を与え続けます。このプログラムは、OpenCVによって読み込まれるごとに各フレームを表示することを意図しており、コンピュータ上のファイルで動作します。もし私が間違っていることを指摘できたら、私はそれを感謝します。セグメンテーションフォールトOpenCV cap.read udp stream Python

import cv2 
import numpy as np 

cap = cv2.VideoCapture("udpsrc port=5600 caps=\"application/x-rtp, format=(string)I420, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)bt709, framerate=(fraction)25/1\" ! rtph264depay ! decodebin ! appsink") 

while(cap.isOpened()): 
    print "loop" 

    ret, frame = cap.read() 
    print "ret, frame" 

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    print "gray" 

    cv2.imshow('frame', gray) 
    print "imshow" 
    if cv2.waitKey(40) & 0xFF == ord('q'): 
     print "breaking" 
     break 

cap.release() 
cv2.destroyAllWindows() 

出力は次のとおり

ループ RET、フレーム グレー 関数imshow ループ セグメンテーション障害(コアダンプ)

実行:端末作品に

gst-launch-1.0 -e udpsrc port=5600 caps="application/x-rtp, format=(string)I420, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)bt709, framerate=(fraction)25/1" ! rtph264depay ! decodebin ! avimux ! filesink location=/home/lab/Desktop/test.avi 

ちょうどいいので、私は次に何を見るか分からない。

ありがとうございました。

編集:

if cap.set(3, 1280)==True: 
    print "width set" 
else: 
    print "error width" 
    sys.exit() 

if cap.set(4, 720)==True: 
    print "height set" 
else: 
    print "error height" 
    sys.exit() 

を "キャップ= cv2.VideoCapture()...一方(cap.isOpened())" の間: をSAMER Tufailによって示唆されるように、私が追加しようとしました。しかし、今は違うエラーが出ます(私は== Trueを使って試してみました)。

GStreamer Plugin:埋め込みビデオの再生が停止しました。モジュールudpsrc0が報告されました:内部データフローエラーです。 icvStartPipeline、ファイル/home/lab/Sam/OpenCV/opencv/modules/videoio/src/cap_gstreamer.cpp、行407でOpenCVエラー:未指定のエラー(GStreamer:パイプラインを開始できません) トレースバック(最新のコール最後) : ファイル "OpenCV_Gst.py"、行9、 の場合cap.set(3、1280)== True: cv2.error:/ home/lab/Sam/OpenCV/opencv/modules/videoio/src/cap_gstreamer .cpp:407:エラー:(-2)のGStreamer:関数icvStartPipelineパイプライン を開始することができない

+0

call cap.set-cap.set(3、1280);あなたのループの前にcap.set(4,720)。呼び出しが成功したかどうかによってtrueかfalseを返すので、cap.setの戻り値を確認してください。 –

+0

GStreamerのログを確認できますか?env変数GST_DEBUG = 3を使用してください – nayana

答えて

-1

私は同じ問題を解決するため、私はこれ:

cap = cv2.VideoCapture("udpsrc port=5600 caps=\"application/x-rtp, 
format=(string)I420, width=(int)1280, height=(int)720, 
pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, 
colorimetry=(string)bt709, framerate=(fraction)25/1\" ! rtph264depay ! 
videoconvert ! decodebin ! appsink") 

それは動作します。

関連する問題