opencv Probleme beim Einlesen von "JPEG"

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
lexx
User
Beiträge: 19
Registriert: Sonntag 23. Dezember 2018, 14:15

Hallo

Leider habe ich grade ein Problem mit opencv und *JPEG* Dateien, dass ich nicht verstehe und ich würde gerne wissen, wo das Problem liegt.

Wenn ich zum Einlesen der Dateien in das Verzeichnes wechsel, wo sich die Bilder befinden, läuft die schleife durch und alles ist gut.
Gebe ich aber in einer Schleife den Pfad an, wirft Python mir eine Fehler aus.
Mache ich das ganze mit *jpg* funktioniert auch alles wunderbar.

Hänge mal was an, um es besser nachollziehen zu können

Code: Alles auswählen

from pathlib import Path
import os
import cv2
def geht():
    path = r"C:\Users\Nutzer\Desktop\BIlder"
    os.chdir(path)
    files = [i for i in Path().rglob("*.jpeg")]
    for file in files:
        print(file)
        image= cv2.imread(str(file))
        cv2.imshow("",image)
        cv2.waitKey(1)

def geht_nicht():
    path = r"C:\Users\Nutzer\Desktop\BIlder"
    files = [i for i in Path(path).rglob("*.jpeg")]
    for file in files:
        print(file)
        image = cv2.imread(str(file))
        cv2.imshow("", image)
        cv2.waitKey(1)
Hier noch die Fehlermeldung:
cv2.error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:352: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@lexx: Ist das jeweils der *tatsächliche* Code der da gelaufen ist, oder etwas das so ähnlich ist. Ich frage weil mir das grosse "I" in "BIlder" seltsam vorkommt.

Und wie sahen die `print()`-Ausgaben aus?

Die „list comprehension“ nutzt nicht wirklich dieses Syntaxkonstrukt sinnvoll. Da wäre ein `list()`-Aufruf einfacher gewesen. Und im Grunde braucht man ja nicht einmal den.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
lexx
User
Beiträge: 19
Registriert: Sonntag 23. Dezember 2018, 14:15

Hi __blackjack__,
das große I steht auch so im Pfad. Also sollte es trotzdem funtionieren.
Denke, dass opencv hier irgendwelche Probleme hat, wenn ich nämlich den Tei von opencv rausnehme, läuft es durch.
Bedeutet, dass der erste print kommt und nach dem einlesen von opencv, kommt die Fehlermeldung.

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Users/Nutzer/PycharmProjects/Daten/example.py", line 24, in <module>
C:\Users\Nutzer\Desktop\BIlder\IMG.jpeg
    geht_nicht()
  File "C:/Users/Nutzer/PycharmProjects/Daten/example.py", line 20, in geht_nicht
    cv2.imshow("", image)
cv2.error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:352: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
Die „list comprehension“ nutzt nicht wirklich dieses Syntaxkonstrukt sinnvoll. Da wäre ein `list()`-Aufruf einfacher gewesen. Und im Grunde braucht man ja nicht einmal den.
Kannst du mir das was genauer erklären?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@lexx: Der Code unterscheidet sich jetzt aber von dem in dem Beitrag davor. Im Beitrag davor steht ``cv2.imshow("", str(image))`` und hier im Traceback sieht man aber aber, dass da tatsächlich ``cv2.imshow("", image)`` steht. Was auch den Fehler wunderbar erklären würde. Darum bitte immer auch den tatsächlichen Code zeigen und nicht etwas was so ähnlich ist. Denn genau in diesen Unterschieden kann ja das Problem stecken!

Bei der „list comprehension“ meinte ich das ``[item for item in iterable]`` diese Syntax nicht wirklich sinnvoll nutzt, denn Elemente aus einem iterierbaren Objekt einfach unverändert in einer Liste zu sammeln wäre einfach nur ``list(iterable)``. Und in diesem speziellen Fall braucht man die Liste auch gar nicht wirklich erst einmal komplett im Speicher zu erstellen, weil man in der nachfolgenden ``for``-Schleife auch direkt über das iterierbare Objekt iterieren könnte.

Code: Alles auswählen

    for file_path in Path(r"C:\Users\Nutzer\Desktop\BIlder").rglob("*.jpeg"):
        print(file_path)
        cv2.imshow("", cv2.imread(str(file_path)))
        cv2.waitKey(1)
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
lexx
User
Beiträge: 19
Registriert: Sonntag 23. Dezember 2018, 14:15

Erst mal danke für das erklären.
Im Beitrag davor steht ``cv2.imshow("", str(image))``
Also ich glaube, hier hast du was falsch gelesen.
Wenn ich das richtig sehe, steht im Beispiel geht und geht_nicht:

Code: Alles auswählen

image= cv2.imread(str(file))
        cv2.imshow("",image)
        cv2.waitKey(1)
Das Einzige was ich geändert hatte, war der Pfad als ich es hier reingestellt habe.
Den hier gezeigten Code, habe ich erstellt, um dem Fehler auf die Schliche zukommen.
Er hat beim Druchlauf denselben Fehler produziert. Übrigens auch dein Beipsiel.

Was mich jetzt richig ärgert ist, ist, dass heute Morgen nach einem Neustart alles durchläuft.
Sprich, geht, geht_nicht und deine Variante laufen ohne Probleme.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@lexx: 😳 Ups, ja da habe ich was durcheinander gebracht. Sorry.

Nicht ärgern, freuen dass es funktioniert. 😉
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten