openCV (-215:Assertion failed)

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.
Antworten
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Hallo Zusammen,

ich habe hier ein Problem, was mir echt Kopfzerbrechen bereitet:

cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

Natürlich habe ich mich schon umfangreich schlau gemacht, wo der Fehler liegt. Es hat definitiv mit meinem Pfad zu tun...aber hier wird es irgendwie strange (natürlich kann ich zu 100% ausschließen, dass ein Fehler im Pfad selbst liegt) Selbstverständlich gibt es die Videodatei auch und sie ist auch nicht korrupt.

Folgende Funktion habe ich geschrieben, um den Fehler einzugrenzen:

Code: Alles auswählen

def playout(path):

    cap = cv2.VideoCapture(path)
    cap.set(cv2.CAP_PROP_POS_FRAMES,0)
   

    while(True):
        # Capture frame-by-frame
        ret, frame = cap.read()
        print(ret)
        print(frame)
        
        
        # Display the resulting frame
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        #sleep(3.5)
Nun kommt der im Logfile angemerkte Pfad, den ich als r"..." gespeichert habe (um Unicode Problematik auszuschließen). Hier speichere ich mehrere Varianten, mal mit \\, dann als / und dann über os.path.join.:

Code: Alles auswählen

x = r"L:\Cam15-MP4\frame_store\100\Video1\complete\video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4"
y = r"L:/Cam15-MP4/frame_store/100/Video1/complete/video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4"
b = r"L:\\Cam15-MP4\\frame_store\\100\\Video1\\complete\\video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4"
z= r"video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4"
w = x + z
path_a = r"L:\Cam15-MP4\frame_store\100\Video1\complete"

wave = Path(r"L:\Cam15-MP4\frame_store\100\Video1\complete", "video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4")
path = os.path.join(path_a, z)
s = os.path.join(x)
Merkwürdig ist aber, dass nur die Variante z (das Videofile liegt auf dem Desktop, das Python Skript ebenfalls) funktioniert. Das Problem liegt also im Pfad:
L:\Cam15-MP4\frame_store\100\Video1\complete

Nun habe ich sowohl den Pfad wie auch die Datei folgendermaßen geprüft:

Code: Alles auswählen

playout(s)

if os.path.exists(r"L:\Cam15-MP4\frame_store\100\Video1\complete"):
    # Does only exists as raw string formatting
    print("path exist")
else:
    print("path does not exist")

if os.path.isfile(r"L:\Cam15-MP4\frame_store\100\Video1\complete\video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4"):
    # File exists!
    print("file exist")
else:
    print("file does not exists")
Sowohl der Pfad gibt True zurück (Aber nur mit r"...") und das File existiert ebenfalls.

Nun meine Frage, wo liegt der Fehler? Das Video gibt es, der Pfad ist korrekt (er ist ultra lang, aber das ist leider auf dem Server so). Ich kann das File auch über die Funktion Playout() anspielen, ABER NUR wenn ich die Variante auf dem Desktop benutze.

Ich hab auch noch andere Pfade, die ich der Funktion übergebe, die relativ ähnlich sind und die funktionieren problemlos! Das ist wichtig, die Logik funktioniert bei einigen Fällen ganz genau so, wie ich es geschrieben habe. Nur in diesem Testfall, den ich versuche zu verstehen, kommt der o.g. openCV Traceback...wenn ich den gesamten Pfad angebe.

Ich würde mich tierisch freuen, wenn ihr mir hier weiterhelfen könnt, weil es das letzte Problem ist, was es für mich zu lösen gilt.

Über jeden Hinweis bin ich echt dankbar.

Viele Grüße,
Marc
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast hier eine Reihe von Begriffsverwirrungen, und recht konfusen Code. r-Strings haben nichts mit Unicode, sonder was mit Escape-Codes zu tun. Also \ statt \\ schreiben zu koennen. Ein File hat einen Pfad. Und ein Verzeichnis hat auch einen Pfad. Pfad ist also ein Oberbegriff fuer alles, was irgendwie auf deiner Platte lebt. Du benutzt aber Pfad so, also ob es ein Verzeichnis waere, und kontrastierst das mit File, einem Pfad zu einer Datei. Die wilde Mischung aus os.path und pathlib.Path ist auch nicht so dolle. Code wie

w = x + z

wobei x eine mp4-Datei ist sieht auch nicht korrekt aus, von der zu vermeidenden Verwendung von + zum zusammenstoepseln von Pfaden mal abgesehn - was genau soll das ergeben?

Warum pruefst du nicht einfach die Existenz des uebergebenen s in playout? Dann weisst du doch, ob die Funktion ein passendes Argument bekommt, oder nicht. Denn dein Vorgehen, einen Parameter zu uebergeben (s), aber danach irgendwelche fest-kodierten Pfade zu pruefen, hat doch keine Aussagekraft. Woher ist denn sichergestellt, das s gleich dem ist, was du da spaeter pruefst?

Alles in allem hast du dich glaube ich einfach erfolgreich verwirrt. Einen Grund, warum dieser OpenCV Code mit bestimmten Pfaden nicht umgehen kann, ist jedenfalls erstmal so nicht ersichtlich. Ausser esoterischen Rechteproblemen oder Netzwerklaufwerksmagie, aber das glaube ich eher nicht.
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Okay, ja ich versuche es mal kurz und kompakt:

Code: Alles auswählen

L:\Cam15-MP4\frame_store\100\Video1\complete\video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4
Das ist der Pfad zu meinem Video.

Das Video selbst ist abspielbar und vorhanden. Mit diesem Pfad hat openCV aber ein Problem. Ich übergebe den String ganz genau so:

Code: Alles auswählen

r"L:\Cam15-MP4\frame_store\100\Video1\complete\video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4"
Woran könnte der geworfene Fehler also liegen? An der Datei liegt es nicht. Was könnte ich alternativ sonst noch probieren, was ich noch nicht probiert hätte?

Kopiere ich das Video einfach auf den Desktop und nutze das so:

Code: Alles auswählen

r"video.100.1599549930306.unk.Video1.1618456766.1618457369873.1619177086780.1456675434085540.1456675434085540.1618457375872.1619180686860.1456675758085540.1456675758085540.3600.mp4"
Gibt es keinen Fehler.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und hast wie vorgeschlagen in playout die Existenz des arguments geprüft? Das Python da ja aber OpenCV Nein sagt wäre zumindest mal ungewöhnlich.
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

Schon

Code: Alles auswählen

import pathlib
:
wave = pathlib.Path(r"L....u.s.w
ausprobiert?
Antworten