Mit cv2 rtsp stream öffnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
toper
User
Beiträge: 73
Registriert: Freitag 13. April 2018, 14:37

Hallo zusammen,

ich habe eine IP-Cam und möchte gerne das Bild mit cv2 auslesen.

Mit dem VLC Player kann ich den Stream öffnen. In Python bekomme ich aber nur eine Fehlermeldung.

Code: Alles auswählen

cap = cv2.VideoCapture("rtsp://admin:123456@192.168.2.129")

ret, img = cap.read()

cv2.imshow('video_output', img)
        
cap.release()
cv2.destroyAllWindows()
Traceback (most recent call last):
File "C:\Users\Tobias\Desktop\test.py", line 10, in <module>
cv2.imshow('video_output', img)
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-oduouqig\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
Weiß jemand woran das liegt?
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Fehler besagt, dass du keinen gültigen Frame hast. Der ist None. Das kann AFAIK bei einem stream schon mal passieren. Da musst du eben eine Weile lesen, und wenn dann immer noch keiner kommt, gibt es ein Problem.
toper
User
Beiträge: 73
Registriert: Freitag 13. April 2018, 14:37

Heißt das, es gibt keine Lösung dafür?
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, das habe ich nicht geschrieben.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Du ignorierst den Rückgabewert `ret`. Solange der nicht wahr ist, musst du cap.read nochmal aufrufen.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@toper,

ich habe schon lange nichts mehr mit opencv gemacht, aber nach etwas Suche im Netz findet man oft solche Code-Beispiele:

Code: Alles auswählen

cap = cv2.VideoCapture("rtsp://admin:12345@192.168.1.64/main/Channels/1")
print (cap.isOpened())
while cap.isOpened():
    success,frame = cap.read()
    cv2.imshow("frame",frame)
    cv2.waitKey(1) 
toper
User
Beiträge: 73
Registriert: Freitag 13. April 2018, 14:37

Ich habe jetzt mal folgendes versucht:

Code: Alles auswählen

cap = cv2.VideoCapture("rtsp://admin:123456@192.168.2.129")

ret = False
while ret == False:
        ret, img = cap.read()

cv2.imshow('video_output', img)
        
cap.release()
cv2.destroyAllWindows()

Allerdings hilft das nichts, da ret immer False ist.
Er findet den Stream einfach nicht
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du prüfst, ob der erste Frame gut ist. Wissen wir schon: ist er nicht. Also musst du mehrfach Frames abholen. Mach daraus ein while True, und wenn das nach mehren Sekunden immer noch nichts liefert, DANN findet er den Stream nicht.
toper
User
Beiträge: 73
Registriert: Freitag 13. April 2018, 14:37

Auch nach öfterem überprüfen funktioniert es nicht.

Aber, wenn ich denselben Link im VLC Player eingebe funktioniert es.

Es kann also nicht am Link liegen.
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann kann opencv das so nicht. Ggf ist das Format nicht unterstützt, und du kannst es mit VLC wo es ja geht transkodieiren: https://wiki.videolan.org/Documentation ... _streaming
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@toper: Wie übeprüfst du das denn mehrmals? Zeig mal den Code, bitte.
toper
User
Beiträge: 73
Registriert: Freitag 13. April 2018, 14:37

Der Code mit dem mehrfachen überprüfen sieht so aus:

Code: Alles auswählen

cap = cv2.VideoCapture("rtsp://admin:123456@192.168.2.129")

ret = Flase
while ret == False:
	ret, img = cap.read()

cv2.imshow('video_output', img)
        
Ich habe auch noch einen anderen Ansatz versucht.
Mit der VLC Bibliothek in Python kann ich den Stream auch auslesen.
Hierbei fehlt mir allerdings der Schritt, wie ich cv2 einen Frame aus dem VLC Stream übergeben kann.
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst nur ein numpy Array erzeugen.
toper
User
Beiträge: 73
Registriert: Freitag 13. April 2018, 14:37

Und wie mache ich das?
Ich muss ja zuerst irgendwie an einen einzelnen Frame herankommen.
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du sagst doch du kommst an die Bilder mit der VLC Bibliothek. Die wird dir doch die Pixel geben, oder was sonst heißt das?
toper
User
Beiträge: 73
Registriert: Freitag 13. April 2018, 14:37

Ich kann mit dem VLC Player den Stream lesen und abspielen.
Ich benötige aber die einzelnen Frames, die ich cv2 übergeben kann.
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

toper hat geschrieben: Montag 19. Juli 2021, 09:36 Mit der VLC Bibliothek in Python kann ich den Stream auch auslesen.
Das sind doch deine Worte. Wie bekommst du denn dann “den stream ausgelesen”? Was kriegst du da, was sagt die Dokumentation wie du an Pixelwerte kommst?
toper
User
Beiträge: 73
Registriert: Freitag 13. April 2018, 14:37

Ich kann mit VLC.MediaPlayer den Stream "empfangen" und ihn mit play() abspielen.

Das Problem ist, dass ich bisher nichts gefunden habe, wie ich einzelne Frames bekomme ohne sie speichern zu müssen oder wie ich sie cv2 übergeben kann.
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal einen Link auf die entsprechende Bibliothek?
Antworten