wake-up-neo.net

Lesen Sie Frames vom RTSP-Stream in Python

Ich habe vor kurzem eine Raspberry Pi-Kamera eingerichtet und streame die Frames über RTSP. Es ist zwar nicht unbedingt notwendig, doch hier ist der Befehl, mit dem ich das Video ausstrahle:

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

Dadurch wird das Video perfekt gestreamt.

Was ich jetzt tun möchte, ist, diesen Stream mit Python zu analysieren und jeden Frame einzeln zu lesen. Ich würde gerne eine Bewegungserkennung für Überwachungszwecke durchführen. 

Ich habe keine Ahnung, wo ich mit dieser Aufgabe anfangen soll. Kann mich jemand auf ein gutes Tutorial verweisen? Wenn dies nicht über Python möglich ist, mit welchen Tools/Sprachen kann ich dies erreichen?

9
fmorstatter

Eine harte Lösung, aber Sie können die VLC-Python-Bindungen verwenden (Sie können sie mit pip install python-vlc installieren) und den Stream abspielen:

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

Dann mache jede Sekunde einen Schnappschuss:

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

Und dann können Sie SimpleCV oder etwas für die Verarbeitung verwenden (laden Sie einfach die Bilddatei '.snapshot.tmp.png' in Ihre Verarbeitungsbibliothek).

11
Samadi

verwenden Sie opencv

video=cv2.VideoCapture("rtsp url")

und dann können Sie Framse erfassen. Lesen Sie die openCV-Dokumentationsbesuche: https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html

Abhängig vom Stream-Typ können Sie dieses Projekt wahrscheinlich auf einige Ideen überprüfen.

https://code.google.com/p/python-mjpeg-over-rtsp-client/

Wenn Sie Mega-Pro sein möchten, können Sie etwas wie http://opencv.org/ (Python-Module sind meiner Meinung nach verfügbar) für die Bewegungserkennung verwenden. 

3

Die gleiche Methode, die von "depu" angegeben wurde, funktionierte perfekt für mich. Ich habe nur "Videodatei" durch "RTSP-URL" der aktuellen Kamera ersetzt. (Dies hat in früheren Versionen von OpenCV eine Zeit lang nicht funktioniert) Funktioniert mit OpenCV 3.4.1 Windows 10) 

import cv2
cap = cv2.VideoCapture("rtsp://root:[email protected]:554/axis-media/media.amp")

while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
2
venkat

Mit Hilfe von Python und OpenCV lassen sich Frames vom Video lesen. Unten ist der Beispielcode. Funktioniert gut mit Python und Opencv2-Version.

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()
0
deepu

Hier ist noch eine weitere Option

Es ist viel komplizierter als die anderen Antworten. :-O

Mit nur einer Verbindung zur Kamera könnten Sie auf diese Weise den gleichen Stream gleichzeitig mit mehreren Multiprozessen "verzweigen", auf den Bildschirm bringen, ihn in Multicast umwandeln, auf die Festplatte schreiben usw. 

.. natürlich nur für den Fall, dass Sie so etwas brauchen würden (sonst würden Sie die früheren Antworten bevorzugen)

Lassen Sie uns zwei unabhängige Python-Programme erstellen:

(1) Serverprogramm (RTSP-Verbindung, Dekodierung) server.py

(2) Client-Programm (liest Frames aus dem Shared Memory) client.py

Der Server muss vor dem Client gestartet werden, d.

python3 server.py

Und dann in einem anderen Terminal:

python3 client.py

Hier ist der Code:

(1) server.py

import time
from valkka.core import *

# YUV => RGB interpolation to the small size is done each 1000 milliseconds and passed on to the shmem ringbuffer
image_interval=1000  
# define rgb image dimensions
width  =1920//4
height =1080//4
# posix shared memory: identification tag and size of the ring buffer
shmem_name    ="cam_example" 
shmem_buffers =10 

shmem_filter    =RGBShmemFrameFilter(shmem_name, shmem_buffers, width, height)
sws_filter      =SwScaleFrameFilter("sws_filter", width, height, shmem_filter)
interval_filter =TimeIntervalFrameFilter("interval_filter", image_interval, sws_filter)

avthread        =AVThread("avthread",interval_filter)
av_in_filter    =avthread.getFrameFilter()
livethread      =LiveThread("livethread")

ctx =LiveConnectionContext(LiveConnectionType_rtsp, "rtsp://user:[email protected]", 1, av_in_filter)

avthread.startCall()
livethread.startCall()

avthread.decodingOnCall()
livethread.registerStreamCall(ctx)
livethread.playStreamCall(ctx)

# all those threads are written in cpp and they are running in the
# background.  Sleep for 20 seconds - or do something else while
# the cpp threads are running and streaming video
time.sleep(20)

# stop threads
livethread.stopCall()
avthread.stopCall()

print("bye") 

(2) client.py

import cv2
from valkka.api2 import ShmemRGBClient

width  =1920//4
height =1080//4

# This identifies posix shared memory - must be same as in the server side
shmem_name    ="cam_example"
# Size of the shmem ringbuffer - must be same as in the server side
shmem_buffers =10              

client=ShmemRGBClient(
name          =shmem_name,
n_ringbuffer  =shmem_buffers,
width         =width,
height        =height,
mstimeout     =1000,        # client timeouts if nothing has been received in 1000 milliseconds
verbose       =False
) 

while True:
index, isize = client.pull()
if (index==None):
    print("timeout")
else:
    data =client.shmem_list[index][0:isize]
    img =data.reshape((height,width,3))
    img =cv2.GaussianBlur(img, (21, 21), 0)
    cv2.imshow("valkka_opencv_demo",img)
    cv2.waitKey(1)

Wenn Sie interessiert sind, lesen Sie mehr unter https://elsampsa.github.io/valkka-examples/

0
El Sampsa