2013-07-31 31 views
7

Ho recentemente installato una fotocamera Raspberry Pi e sto trasmettendo i frame su RTSP. Anche se potrebbe non essere completamente necessario, ecco il comando che sto utilizzando per trasmettere il video:Leggi frame da RTSP Stream in Python

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

Questo streaming del video perfettamente.

Quello che vorrei fare ora è analizzare questo flusso con Python e leggere ogni frame singolarmente. Mi piacerebbe fare alcuni rilevamenti di movimento a scopo di sorveglianza.

Sono completamente perso su dove iniziare in questa attività. Qualcuno può indicarmi un buon tutorial? Se questo non è possibile tramite Python, quali strumenti/lingue posso usare per realizzare questo?

+0

Guardate qui: http://superuser.com/questions/225367/i-need-motion-detection-on-a-rtsp-stream ... Sembra che anche VLC è in grado di farlo .. – hek2mgl

risposta

7

Bit di una soluzione hacky, ma è possibile utilizzare la VLC python bindings e riprodurre il flusso:

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

Poi scattare una foto ogni secondo o giù di lì:

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

E quindi è possibile utilizzare SimpleCV o qualcosa da elaborare (basta caricare il file di immagine '.snapshot.tmp.png' nella libreria di elaborazione).

+0

come posso usare il file '.snapshot.tmp.png'? –

+0

@ShaiM. Allo stesso modo in cui useresti qualsiasi altro file PNG – Samadi

+0

Può essere usato anche con il server Ubuntu? –

0

È possibile ottenere fotogrammi di lettura dal video utilizzando Python e OpenCV. Di seguito è riportato il codice di esempio. Funziona bene con la versione python e 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()