Raspberry Pi Python Kivy Problem mit Bilder updaten

  • Hallo liebe Raspberry Freunde,


    ich habe aktuell ein Projekt mit dem Raspberry Pi, einem Touchscreen, einer Cam und Kivy am laufen.

    Es läuft soweit auch alles sehr gut, nur leider habe ich noch ein kleines aber wichtiges Problem.

    Ich erstelle mir jede Sekunde von der Cam ein Bild und will dies in Kivy updaten. Dies funktioniert auch soweit, also er updatet jede Sekunden dieses, aber er "reloaded" es nicht, er zieht einfach das Bild aus einem alten Buffer sozusagen raus und verwendet dieses wieder.

    Vielleicht hab ich Glück und jemand kennt sich mit Kivy aus und kann mir dabei helfen, wie ich diesen "Buffer" vor erneutem laden löschen kann.


    Hier noch der wichtige Python Codeausschnitt:

    Code
    1. #Update die CamBilder alle "UpdateCamZeit"-Sek
    2. def Cam_Update(self, dt):
    3. global bild_counter, var_pfad_alt
    4. if os.path.isfile('/Bilder/livecam.jpg'):
    5. os.popen('cp /Bilder/livecam.jpg /Bilder/livecam_bildschirm_1.jpg')
    6. self.Bild = '/Bilder/livecam_bildschirm_1.jpg'

    und der dazugehörige Kivy Ausschnitt:


    Code
    1. <Hauptfenster>:
    2. BoxLayout:
    3. BoxLayout:
    4. orientation: "vertical"
    5. Image:
    6. id: Bild
    7. source: root.Bild
    8. size_hint_x: 1
    9. size_hint_y: 1


    Also noch kurz erklärt: "Cam_Update" wird jede Sekunde upgedatet und überschreibt dann die source: root.Bild mit dem neuen Bild.

    Mit verschiedenen Versuchen hab ich aber herausgefunden, dass er in "Bild" immer wieder das erste "jpg" lädt, obwohl sich das bild "livecam_bildschirm_1.jpg" bereits geändert hat. Deswegen vermute ich auf einen dazugehörigen Buffer, aber ich finde keine Möglichkeit diesen zu cleanen bzw zu umgehen.:conf:


    Schon mal vielen Dank an alle die versuchen mir zu helfen.:danke_ATDE:



    Viele liebe Grüße an alle fleißigen Raspberry Pi Bastler

  • Moin,

    der Effekt kommt mir aus meinen PHP-Zeiten bekannt vor. Bei PHP hilft clearstatecache(). Bei Python gibt es sowas vielleicht auch. Kenne ich nur nicht.

    Als Versuch eines Workaround würde ich folgendes prüfen:

    Eventuell führt das cp schon zum Problem, da die Zieldatei eventuell nur "modified" ist. Versuch: Vor dem cp die Zieldatei löschen.

    Nach dem cp Quelldatei löschen.


    Wenn das nicht hilft, die Zieldatei alternieren, livecam_bildschirm_1.jpg/livecam_bildschirm_2.jpg. Vor dem cp aber die jeweils alte Zieldatei wiederum löschen.


    Ich kann mir ausserdem vorstellen, dass bei der häufigen Aktualisierung das Dateisystem aus Performancegründen eben immer auf die alte Daten (da gleiche Datei) zugreift . Daher besteht eventuell auch die Möglichkeit, dass beim cp schon die Cachedaten zum Erstellen der Zieldaten verwendet werden.

    Das müsste dann aber einfach prüfen können, einfach mal livecam_bildschirm_1.jpg mit livecam_bildschirm_2.jpg vergleichen.

    In dem Fall würde ich versuchen, das Dateisystem zu einer Aktualisierung zu zwingen. Idee: Erstellungszeitpunkt der Quelldatei abfragen, oä. Dann cp.


    Eventuelle Ursache: Vielleicht ist aber auch der Datenträger so langsam, wodurch das Dateisystem dann mal entspannt mit alten Cache-Daten hantiert.

    Derart häufige Schreibzugriffe auf der SD Karte (ich vermute , es ist eine) würde ich ohnehin nicht machen. Dann lieber eine Ramdisk anlegen (tmpfs).


    Das oben Beschriebene sind "nur" Strategien. Die genauen Befehle habe wie immer nicht parat...


    Viel Erfolg.

  • Vielen Dank ottosieben,:danke_ATDE:

    Zitat

    Eventuell führt das cp schon zum Problem, da die Zieldatei eventuell nur "modified" ist. Versuch: Vor dem cp die Zieldatei löschen.

    Nach dem cp Quelldatei löschen.

    Den ersten Punkt versuche ich mal, vielleicht hilft mir dieser.


    Zitat

    Wenn das nicht hilft, die Zieldatei alternieren, livecam_bildschirm_1.jpg/livecam_bildschirm_2.jpg. Vor dem cp aber die jeweils alte Zieldatei wiederum löschen.

    Die Zieldatei alternieren hilft aber nichts, habe ich bereits versucht, aber nach ca 6-10 Bildern lädt er mir nur noch sporadisch die Bilder (weiß aber auch nicht wieso, vermutlich auch ein Cacheproblem).


    Zitat

    Ich kann mir ausserdem vorstellen, dass bei der häufigen Aktualisierung das Dateisystem aus Performancegründen eben immer auf die alte Daten (da gleiche Datei) zugreift . Daher besteht eventuell auch die Möglichkeit, dass beim cp schon die Cachedaten zum Erstellen der Zieldaten verwendet werden.


    Das müsste dann aber einfach prüfen können, einfach mal livecam_bildschirm_1.jpg mit livecam_bildschirm_2.jpg vergleichen.

    Dies habe ich schon untersucht. Die kopierte Datei passt immer mit der dazugehörigen Datei zusammen, also diese ändern sich schon richtig.


    Zitat

    Eventuelle Ursache: Vielleicht ist aber auch der Datenträger so langsam, wodurch das Dateisystem dann mal entspannt mit alten Cache-Daten hantiert.


    Derart häufige Schreibzugriffe auf der SD Karte (ich vermute , es ist eine) würde ich ohnehin nicht machen. Dann lieber eine Ramdisk anlegen (tmpfs).

    Ja das will ich eh noch auslager, aber zum testen hab ich es jetzt nur mal auf der SD gelassen.


    Viele liebe Grüße

  • Was macht < cp /Bilder/livecam.jpg /Bilder/livecam_bildschirm_1.jpg > aus der Konsole aus aufgerufen ?


    Möglicherweise kannst Du mit der passenden cp - Option (siehe < cp --help> ) die Zieldatei ohne Bestätigung überschreiben, wenn nicht auch ein Schreibrechte-Problem dazukommt.


    Servus !

    Wer nichts weiß, muss alles glauben.