Sporadische Fehlermeldung bei aufgenommenen Fotos: Bilddatei enthält keine Daten

  • Hallo zusammen,

    Ich habe ein Problem, bei welchem ich eure Hilfe / euer Fachwissen gebrauchen könnte. Ich nehme mittels eines Raspberry Pi 3, einer Webcam und eines Scanners Bilder auf. Jedes mal wenn ein Barcode gescannt wird, soll ein Foto mit der Webcam aufgenommen werden. Das Funktioniert größtenteils auch ganz gut. Der Code ist in Python 3 geschrieben.

    Mein Problem ist allerdings, dass sporadisch Bilder keine Daten enthalten. Das heißt: Wenn ich auf die Bilder im Ordner zugreife und über die Pfeiltasten mich durchklicke, sind sporadisch einzelne Bilder mit folgender Fehlermeldung dazwischen:

    Zitat

    Bilddatei>>/home/pi/Bildprogramm/Bilder/Kamera1/1234567.jpg<< enthält keine Daten

    Ich hoffe mir kann jemand helfen das Problem zu lösen. Die Suchfunktion und Google konnten mir leider nicht weiterhelfen.

    Über ein paar nützliche Tipps oder Hinweise wäre ich sehr dankbar:danke_ATDE:.

    Gruß, okliw993

  • Sporadische Fehlermeldung bei aufgenommenen Fotos: Bilddatei enthält keine Daten? Schau mal ob du hier fündig wirst!

  • Da hast du Recht. Ich habe gerade noch mal drei Bilder aufgenommen wobei Eines die besagte Fehlermeldung beim Öffnen anzeigt. Die Gesamtgröße dieser Datei beträgt 0 Bytes. Die anderen Beiden haben 35 und 24 Bytes...

    Kannst du mir sagen wo mein Fehler ist und wie ich das Problem lösen kann?

    Und warum die Bilder so unterschiedlich groß sind?

    Gruß und Danke, okliw993

  • Also ich hab's jetzt in Python übersetzt und es funktioniert. Die Abfrage der Dateigröße war ein super Tipp! Riesen Dank dafür! Hier noch mal mein Code..


    Eine Frage hätte ich trotzdem noch. Meine Kamera öffnet sich leider sehr langsam. Das hat zur Folge, dass die Bilder sehr hell sind, da das Foto aufgenommen wird bevor sich der Kontrast richtig eingestellt hat. Ich habe es schon mit nem time.sleep() versucht zu lösen aber das klappt nicht. Vielleicht hast du oder Tell oder Linus da noch eine Idee?

    Gruß, okliw993

  • Hallo,

    wenn du Bildgröße 0 ist, sind entweder keine Bilddaten da oder b) die hängen noch im Schreibpuffer. Du solltest mal die Doku konsultieren, ob da das Schreiben eine möglichen Puffers aus cv2 heraus forcieren kannst.
    Alternativ könntest du auch probieren, den Schreibpuffer systemseitig auszuschalten (das geht auf jeden Fall). Ist aber eigentlich keine Lösung, weil das schon sinnvoll ist, dass der I/O Scheduler des Linux-Kernels Schreibvorgänge ggf. puffert.

    Ansonsten ist der Code an vielen Stellen verbesserungsbedürftig:

    • Variablennamen schreibt man in Python klein_mit_unterstrich
      Warum ist `KennNr`ein String, wenn der Name impliziert, dass es eine Zahl ist?
    • path1 definieren und das gleiche Objekt an path binden macht im gezeigten Kontext keinen Sinn. Und warum path1? Gibt es path2? path3?
    • Die Verwendung von i als Zahl macht keinen Sinn. Was du willst ist i an den Datentyp `Bool` binden, also `True` oder `False`.
    • `if` ist ein Statement in Python, keine Funktion -> die Klammern sind überflüssig.
    • Zeile 13 evaluiert so wie so bei dir _immer_ zu `False`, weil KennNr. ein String ist, du aber mit einem Integer vergleichst. Und `'0' == 0` ist halt immer `False`.
    • Pfade und Dateinamen setzt man mit `os.path.join`zusammen, nicht mit +
    • Die Zeilen 14-16 und 19-21 sind 100% identisch -> DRY Prinzip -> Code in einen eigene Funktion packen.
      Gesetzt den Fall, dass die Bildgröße imme null ist, hast du eine Endlossschleife, aus der du nicht raus kommst.
    Zitat

    Ich habe es schon mit nem time.sleep() versucht zu lösen aber das klappt nicht.

    Welche Wert hast du für `sleep` eingesetzt?

    Gruß, nosiefloor

  • noisefloor:

    Hallo und danke für deine Tipps. Ich werde denen mal nachgehen.

    Was meinen Programmierstil angeht, den bitte ich zu entschuldigen. Ich bin noch am lernen und versuche mich jedes mal zu verbessern. In Python bin ich ein absoluter Neuling weil ich bisher mehr Erfahrungen in Java gesammelt habe. Aber ich werde deine Verbesserungen selbstverständlich umsetzen.

    - KennNr ist ein String, da ich auch Barcodes mit Buchstaben einlese.

    -path2, path3 etc sollen noch kommen wenn mehr Kameras eingebunden werden.

    -ich kann leider kein while True nehmen weil sonst die Qt rumzickt.

    - Fehler in Zeile 13 hatte ich noch nicht bemerkt, Danke!

    Für den 'sleep' hatte ich eine 10 eingesetzt und diesen zwischen Zeile 15 und 16 eingebaut.

    Gruß, okliw993


    daxb

    Hallo,

    Selbstverständlich würde ich am liebsten die Fehlerursache beseitigen. Um das zu tun müsste ich aber wissen wo diese liegt und deshalb frage ich hier ja?!

    Der Workaround hat mir persönlich trotzdem vorerst geholfen. Hast du denn eine Idee wo die Fehlerursache liegt?

  • Leider habe ich keine Erfahrung mit Python oder Kameras am RPi. Daher kann ich leider nicht helfen. Was helfen kann, oder ich machen würde, wäre das Gesamtsystem zu minimalisieren. Also z.B. erst mal Hardware und Software trennen, soweit möglich. Tritt das Problem schon bei der Webcam auf? Wenn nicht vielleicht bei der Übertragung der Daten zum RPi? Also mögliche Ursachen ausschliessen. Vielleicht hilft es auch ein separates Testscript zu schreiben das sich nur auf das Problem konzentriert. Alles andere soweit weglassen um eingrenzen zu können. Timing Probleme oder Race Conditions testen. Sleep ist da schon mal ein Ansatz. Z.B. kann man ausschliessen, das vor dem Zugriff auf die Fotodatei, diese fertig geschrieben ist.

  • Hallo,

    Zitat

    Für den 'sleep' hatte ich eine 10 eingesetzt und diesen zwischen Zeile 15 und 16 eingebaut.

    Ich würde das ja eher zwischen 14 und 15 setzen.

    Zitat

    -ich kann leider kein while True nehmen weil sonst die Qt rumzickt.

    Nein, QT zickt nicht rum. Die kreierst damit "lediglich" eine Endlosschleife, weswegen die GUI nicht mehr reagiert -> Programmierfehler, kein Qt Fehler.
    Abgesehen davon: `while True` ist _nicht_ das Äquivalent zum jetzigen Code. Du kannst jetzt die while-Schleife abbrechen, `while True` nicht direkt. Du musst "nur" dein merkwürdiges Konstrukt mit den Zahlen durch Bool'sche Werte ersetzen, das ist alles.

    Gruß, noisefloor

  • Guten Morgen,

    Zitat

    Ich würde das ja eher zwischen 14 und 15 setzen.

    Ich probiere das mal aus.

    Zitat

    Nein, QT zickt nicht rum. Die kreierst damit "lediglich" eine Endlosschleife, weswegen die GUI nicht mehr reagiert

    Ok das meinte ich im Grunde genommen. Habe mich wohl falsch ausgedrückt.

    Zitat

    Du kannst jetzt die while-Schleife abbrechen

    Das ist ja auch mein Ziel, dass solange Bilder aufgenommen werden, bis die Abbruchbedingung erfüllt ist. Aber sind boolsche Werte nicht True und false?

    MfG okliw993

  • Hallo,

    Zitat

    Aber sind boolsche Werte nicht True und false?

    Ja (bzw: False mit großem F). Aber genau das hast du jetzt auch, nur in extra umständlich. Der Ausdruck hinter if oder while _muss_ zu True oder False evaluieren. `i=0; i<10000` ist `True` und wenn du dann `i=10001` setzt wird es `False`. Dann machst du besser so was wie:

    Python
    ...
    keep_reading = True
    while keep_reading:
        #do something
        if all_is_ok:
            keep_reading = False
    ...

    Gruß, noisefloor

  • Damit werde ich es mal probieren - Danke!

    Aber mein ursprüngliches Hauptproblem, das Bilddatein sporadisch keine Daten haben habe ich noch nicht gelöst bekommen... google hat mir da bislang auch nicht weiterhelfen können. Kann mir evtl jemand eine konkrete Anweisung geben was ich machen kann?

    Weil wie befürchtet kommt es sporadisch dazu, dass sich die while-Schleife aufhängt...

    Wäre echt dankbar wenn ihr noch ein paar Tipps hättet..

    Gruß, okliw993

  • Weil wie befürchtet kommt es sporadisch dazu, dass sich die while-Schleife aufhängt...

    ich habe ein ähnliches Problem am AVR in C und kann nur sagen was ich dort und anderswo so löse,

    wenn

    Zitat

    Bilddatei>>/home/pi/Bildprogramm/Bilder/Kamera1/1234567.jpg<< enthält keine Daten

    auftritt ist es ja schon passiert, ergo vor dem Bildspeichern prüfen ob die Größe 0 ist, alternativ cronjob, ändert sich der Datenbestand Bildanzahl, nach dem Änderungsdatum im Verzeichnis, prüfen ob JPG Größe >0 wenn nicht JPG löschen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Vor dem Speichern kann ich die Dateigröße nicht abfragen, da ich für den getsize -Befehl den Namen und Pfad der Datei haben muss. Cronjob kommt glaube ich nicht in Frage, da ich die Bilder in unregelmäßigen Abständen aufnehme. Oder habe ich Cronjob falsch verstanden?

    Gruß, okliw993

  • Vor dem Speichern kann ich die Dateigröße nicht abfragen, da ich für den getsize -Befehl den Namen und Pfad der Datei haben muss.

    eben drum:

    Cronjob

    wieso nicht, alle 1s oder 0,1s schauen ob sich was im Ordner verändert hat?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ich verstehe den Nutzen von Cronjob dabei noch nicht... Die Bilder sollen sofort aufgenommen werden wenn eine Lichtschranke unterbrochen wird.

    Ich habe spaßeshalber mal das Programm gestartet und zuvor die Kamera abgezogen. Es werden trotzdem Dateien angelegt, allerdings auch mit 0 Byte.. kann es sein das ab und zu die 'bestromung' der Kamera, durch den Raspberry Pi, zu langsam ist und deshalb leere Dateien geschrieben werden?

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!