Bilddateien enthalten sporadisch keine Daten

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
raspi11
User
Beiträge: 3
Registriert: Montag 1. Juli 2019, 07:26

Guten Morgen,

Erstmal danke für die Aufnahme. Ich bin neu hier und versuche mich gerade mit opencv auseinander zu setzen. Dabei stellt sich mir aktuell folgendes Problem:
Wenn ich mehrere Bilder aufnehme, kommt es vereinzelnd dazu, dass die Bilddateien keine Datenenthalten. Beim Versuch eine dieser Dateien zu öffnen wird mir folgende Fehlermeldung angezeigt:
Bilddatei>>/home/pi/test1/1234567.jpg<< enthält keine Daten
Trotzdem wird eine Datei angelegt, welche aber mit 0 Byte beschrieben wird.

Ich verwende ein Raspberry Pi 3, eine Webcam und mein Code sieht wie folgt aus:

Code: Alles auswählen

import numpy as np
import cv2

kennnummer = "ABC"
path1 = '/home/pi/test1/'
while(True):
    kennnummer = input()
    if (kennnummer != "ABC"):
        cap = cv2.VideoCapture(0)
        ret,foto = cap.read()
        cv2.imwrite(path1 + kennnummer + '.jpg', foto)
        cap.release()
Ich hoffe ihr könnt mir helfen. Die Suchfunktion und google habe ich schon durchforstet..

Lieben Gruß, raspi11
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@raspi11: Du wertest `ret` gar nicht aus. `foto` enthält nur dann gültige Bilddaten wenn `ret` wahr ist.

Sonstige Anmerkungen: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst, und die man nur aufruft wenn das Modul als Programm ausgeführt wird.

Man nummeriert keine Namen durch. In solchen fällen will man sich entweder bessere, passendere Namen ausdenken, oder gar keine einzelnen Namen sondern eine Datenstuktur verwenden. Oft eine Liste. Im vorliegenden Fall ist die 1 bei `path` aber einfach nur komplett sinnfrei. Und man könnte den Namen so ändern das der Leser weiss, was für eine Bedeutung der Pfad hat. Zum beispiel `PHOTO_PATH`. Gross geschrieben, weil es eine Konstante ist und keine Variable.

Und statt einer Zeichenkette könnte man tatsächlich ein `pathlib.Path`-Objekt verwenden, denn später das Zusammensetzen von diesem Pfad und dem Dateinamen sollte auf keinen Fall mit ``+`` passieren, sondern entweder über `Path`-Operationen oder mit der `os.path.join()`-Funktion wenn man es bei einer Zeichenkette belässt.

`kennnummer` vor der Schleife an einen Wert zu binden macht keinen Sinn, weil dieser Wert nie irgendwo verwendet wird.

Um Bedingungen bei ``if`` und ``while`` gehören keine Klammern.

Man sollte bei Namen keine Abkürzungen verwenden die nicht allgemein bekannt sind. Das betrifft `cap` und `ret`. Bei `cap` gibt es zusätzlich das Problem das der abkürzte Name selbst wieder eine Bedeutung hat. So etwas ist verwirrend und Namen sollen ja gerade nicht verwirren, sondern dem Leser verraten was der Wert dahinter im Kontext des Programms für eine Bedeutung hat.

Der `release()`-Aufruf sollte in jedem Fall ausgeführt werden, also auch wenn zwischen erstellen des Objekts und dem Aufruf von `release()` eine Ausnahme auftritt. Man braucht da also ``try``/``finally``.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path
import cv2

PHOTO_PATH = Path('/home/pi/test1/')


def main():
    while True:
        kennnummer = input()
        if kennnummer != 'ABC':
            camera = cv2.VideoCapture(0)
            try:
                is_ok, foto = camera.read()
                if is_ok:
                    cv2.imwrite(str(PHOTO_PATH / (kennnummer + '.jpg')), foto)
            finally:
                camera.release()


if __name__ == '__main__':
    main()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
noisefloor
User
Beiträge: 4191
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

es gab vor ~2 Wochen übrigens eine auffällig ähnliche Frage im Raspi-Forum: Link. In dem Thread sind auch div. Antworten zu dem Thema zu finden.

Gruß, noisefloor
raspi11
User
Beiträge: 3
Registriert: Montag 1. Juli 2019, 07:26

Guten Morgen zusammen!
Zuerst, Danke für eure Antworten!

Ich muss gestehen das ich mir meinen Code bisher aus dem Internet zusammengeschustert habe und auch schon über den Link von @noisefloor gestolpert bin. Allerdings waren die Lösungsansätze für meinen Kenntnisstand viel zu hoch und ich konnte damit nicht viel anfangen.

Ich habe meinen Nachmittag gestern damit verbracht, den mein Programm zu überarbeiten und es läuft jetzt wunderbar. Mir war nicht bewusst, bekannt dass 'is_ok' zur Auswertung dient. Vielen dank für deine Hilfestellung @_blackjack_. Eine Frage bliebe dennoch:
Der `release()`-Aufruf sollte in jedem Fall ausgeführt werden, also auch wenn zwischen erstellen des Objekts und dem Aufruf von `release()` eine Ausnahme auftritt. Man braucht da also ``try``/``finally``.
Was genau macht der 'release()' Aufruf und warum sollte der jedes Mal ausgeführt werden??? Da bin ich noch nicht ganz hinter gekommen....
raspi11
User
Beiträge: 3
Registriert: Montag 1. Juli 2019, 07:26

Achso, warum ist es unzulässig die strings von Pfaden mit einem + zusammen zusetzen?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@raspi11: weil erstens Pfade keine Strings sind, und zweitens man viel falsch machen kann und drittens es mit pathlib schon ein Modul gibt, das einem die ganze Arbeit abnimmt.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@raspi11: Im Internet gibt's nicht nur brauchbare und weniger brauchbare Code-Schnippsel, sondern auch die Dokumentationen von den Bibliotheken die man verwendet. Was die die Methoden `read()` und `release()` von `VideoCapture`-Objekten machen, muss man ja nicht raten oder auf magische Weise wissen. Das kann man direkt an der Quelle, also in der Dokumentation von den Leuten die die OpenCV-Bibliothek programmiert haben, nachschlagen: https://docs.opencv.org/2.4/modules/hig ... video.html
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten