2013-07-31 43 views
7

Gần đây tôi đã thiết lập một máy ảnh Raspberry Pi và đang phát trực tuyến các khung hình qua RTSP. Mặc dù có thể không hoàn toàn cần thiết, nhưng đây là lệnh tôi đang sử dụng chương trình phát sóng video:Đọc Khung từ Luồng RTSP bằng Python

raspivid -o - -t 0 -w 1280 -h 800 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/output.h264}' :demux=h264 

Điều này sẽ phát video một cách hoàn hảo.

Điều tôi muốn làm là phân tích cú pháp luồng này bằng Python và đọc từng khung riêng lẻ. Tôi muốn thực hiện một số phát hiện chuyển động cho mục đích giám sát.

Tôi hoàn toàn mất đi nơi bắt đầu nhiệm vụ này. Bất cứ ai có thể chỉ cho tôi một hướng dẫn tốt? Nếu điều này không thể thực hiện được thông qua Python, tôi có thể sử dụng các công cụ/ngôn ngữ nào để thực hiện việc này?

+0

Look đây: http://superuser.com/questions/225367/i-need-motion-detection-on-a-rtsp-stream ... Có vẻ rằng ngay cả vlc có khả năng để làm điều đó .. – hek2mgl

Trả lời

7

Bit của một giải pháp hacky, nhưng bạn có thể sử dụng VLC python bindings và chơi các dòng:

player=vlc.MediaPlayer('rtsp://:8554/output.h264') 
player.play() 

Sau đó, có một bản chụp mỗi giây hoặc lâu hơn:

while 1: 
    time.sleep(1) 
    player.video_take_snapshot(0, '.snapshot.tmp.png', 0, 0) 

Và sau đó bạn có thể sử dụng SimpleCV hoặc một cái gì đó để xử lý (chỉ cần tải tập tin hình ảnh '.snapshot.tmp.png' vào thư viện xử lý của bạn).

+0

Tôi có thể sử dụng tệp '.snapshot.tmp.png' như thế nào? –

+0

@ShaiM. Cũng giống như cách bạn sử dụng bất kỳ tệp PNG nào khác – Samadi

+0

Nó có thể được sử dụng với máy chủ ubuntu không? –

0

Hi đọc khung hình từ video có thể đạt được bằng cách sử dụng python và OpenCV. Dưới đây là mã mẫu. Hoạt động tốt với phiên bản python và opencv2.

import cv2 
import os 
#Below code will capture the video frames and will sve it a folder (in current working directory) 

dirname = 'myfolder' 
#video path 
cap = cv2.VideoCapture("TestVideo.mp4") 
count = 0 
while(cap.isOpened()): 
    ret, frame = cap.read() 
    if not ret: 
     break 
    else: 
     cv2.imshow('frame', frame) 
     #The received "frame" will be saved. Or you can manipulate "frame" as per your needs. 
     name = "rec_frame"+str(count)+".jpg" 
     cv2.imwrite(os.path.join(dirname,name), frame) 
     count += 1 
    if cv2.waitKey(20) & 0xFF == ord('q'): 
     break 
cap.release() 
cv2.destroyAllWindows()