GPHOTO2 Weiterverarbeitung von Dateien

  • Hallo zunächst einmal.

    Ich bin relativer Newbie in der Pi Welt, aber habe schon einiges erfolgreich hinter mich gebracht.
    Jetzt benötige ich aber mal grundliegende Unterstützung, allein schon in der Auswahl der Software bzw. Sprache.

    Ich habe GPHOTO2 an einem Pi4 (Buster) am Laufen und das läuft auch schon sehr gut. Meine DSLR wird angesteuert und per NFS werden die Bilder auf mein Synology NAS geschoben.
    GPhoto2 kann ja mit 2 Befehlen Bilder speichern.
    1. Auf der Card der DSLR
    2. Per Commandscript aus der LIB von GPhoto2... Dann wird ein Bild gemacht und gleich weitergeleitet auf einen Ordner vom Raspberry. (--capture-image-and-download)
    Wobei ich dabei auch gleich einen Namen vergeben kann ... entweder ich vergebe dynamische Namen z.B. das Zeitformat oder immer den Gleichen, aber lasse diesen auf dem Raspberry überschreiben (--force-overwrite --filename xyz.jpg).
    Für Timelapse Aufnahmen bietet sich das Erstere an, für Überwachung (Anzeigen von Parkplatz alle 10 Sek o.ä.) etc. das Zweite.
    Die Bilder landen immer in dem Ordner aus dem heraus man das Script startet.

    Des Weiteren kann ich auch Parameter an das Script hängen:
    z.B. GPhoto2 -F 10 -I 10 -aparture=4 -iso=2 --capture-image-and-download --filename NOW.jpg
    10 Wiederholungen mit 10 Sekunden Abstand bei iso=200 und Blende 4 und dem Namen des Bildes NOW.JPG

    So weit so GUT!::::: . das LÄUFT JA :)
    Ich benötige nun noch einiges mehr an Anforderungen, allerdings sind diese eigentlich sehr einfach .... wenn man weiss wie es geht.

    Ich würde gerne einen Workflow im Raspberry starten, welcher folgendes beinhaltet:
    Eine Datei beinhaltet alle relevanten Einstellungen und der Raspberry übernimmt die Kontrolle per Cron und nicht GPhoto2.
    In dieser Datei sollten aber noch 3 weitere Kleinigkeiten abgearbeitet werden.

    Konkret müsste das Script erstmal die DSLR bedienen, dann nach ein paar Sekunden das gemachte Bild weiterverarbeiten und es in zwei verschiedene Ordner speichern, welche ich dann weiterverwenden kann.
    Schön wäre noch, wenn das aktuelle Bild einen Zeitstempel im Bild selbst bekommen könnte, damit man sehen kann wann es aufgenommen wurde.
    Leider muss das eine Bild immer den gleichen Namen haben, weil es in HTML als Quelle dient.

    Wer jetzt noch Nerven hat::angel: Hier mein Code in Gedankenform: 3 Ordner zur besseren Übersicht


    Lieber Pi4
    bitte das Script DSLR ausführen. (Mache ich dann per Cron oder manuell)


    Gehe in den Ordner DSLR-START
    Canon mach ein Bild mit folgenden Einstellungen -> bla bla -> NOW.jpg
    Nimm das eben erstellte Now.jpg aus DSLR-START und schreibe die aktuelle Zeit in das Bild und speichere es als NOW.jpg im Ordner DSLR-NOW
    Nimm das eben erstellte Now.jpg aus DSLR-START und speichere es als %Y%m%d%H%M%S.jpg im Ordner DSLR-HEUTE (Bild mit Zeitstempel)
    -----
    Somit erhalte ich in einem Ordner eine Datei, welche ich mit Zeitstempel auf einer Webseite anzeigen kann. Das -> NOW.jpg
    Und alle weiteren Dateien in einem eigenen Ordner, welche für eine Timelapse benötigt werden.

    Neben den obergenannten Anforderungen für die ich ein paar Anstöße brauche, stellt sich mir nun die Frage
    ... mache ich das mit Python oder als/in einer *.sh. :conf:

    PUUHHHHH :saint:
    liebe Grüße
    AST

  • Text kann man recht einfach in ein Bild schreiben und dazu noch gleich eine Kopie anlegen:

    Code
    convert -pointsize 20 -fill red -draw "text 120,600 \"$(date)\" " bild.jpg Downloads/bild.jpg
  • Danke :) im Solo - Test hats geklappt. Musste noch Image Magic nachinstallierten . !

    Ich habe jetzt mein Script beisammen und es ist schon garnicht so übel ;)

    Wie ich schon sagte STEP by STEP
    Warum funktioniert das Ausführen innerhalb des Ordners scripts_as?

    Code
    scripts_as $ gphoto2 --capture-image-and-download --filename "Test.jpg"

    ohne Probleme,

    aber nicht ohne Fehlermeldung als BASH

    Code
    scripts_as $ ./dslr.sh


    hier die TestDatei dslr.sh

    Code
    !#/bin/bash
    gphoto2 --force-overwrite --capture-image-and-download --filename "Test.jpg"


    Die Fehlermeldung lautet


    : Datei oder Verzeichnis nicht gefunden

    aber das Bild wird trotzdem erzeugt!!!


    Danke

    • Official Post


    Hatte vorhin keine Zeit und deshalb nur das Stichwort Shebang genannt. Du hast darin einfach nur # und ! verstauscht.


    Korrekt wäre: #!/bin/bash

  • Verdammt :wallbash:
    Hatte ich doch tatsächlich so aus einem Tutorial rauskopiert und mir darüber dann keine Gedanken mehr gemacht.
    Die Fehlermeldung führte mich dann noch in die falsche Richtung bzw. ich dachte das meine Pfadangaben nicht stimmen.

    Vielen Dank :thumbup:
    Andreas

  • Ich frage mal in diesem POST weiter.
    Es läuft einwandfrei exakt so, wie ich es in meinem Anfangs-POST geschrieben habe.

    Eine weiterführende Frage hätte ich noch.
    Ich starte im Moment manuell die BASH Datei -> dslr.sh entweder manuell oder per Cron Job jede Minute (bin ja noch in der Testphase).

    Könnte ich eigentlich eine Timelapse Funktion auch per Bash antriggern. Per Cron jede Minute ist zu wenig. Ein SLEEP auf den Cron, um die Minute zu teilen ist riskant, weil die Kamera bzw. der Pi viel weiterverarbeiten müssen und dann manchmal die Zeit nicht reicht.
    Was aber immer funktioniert ist die EXIT Meldung ... dann ist das Script fertig abgearbeitet (Manchmal auch erst nach weit mehr als z.B. 30 Sek)
    Meine .sh Datei heisst dslr.sh
    Ich denke mir jetzt sowas wie ...
    Ich starte nicht die dslr.sh sondern eine z.B. dslrstart.sh mit folgendem Inhalt.

    Starte -> dslr.sh
    WENN EXIT = 0 in der dslr.sh

    SLEEP 10 sek
    Starte -> dslr.sh


    Damit hätte ich eine dynamische Endlosschleife gestartet ... außer das das Ergebnis eben nicht 0 ist und somit das Script unterbrochen wird.
    Könnte mir auch eine Formel verstellen, welche ein Ergebnis ausrechnet, um das Script zu beenden. Zum Beispiel eine 2te Zahl in der dslr.sh, welche ich dann ändern könnte, um ein falsches Ergebnis zu bringen.

    Ist das prinzipiell so machbar? ...., denn dann würde die jeweils nächste Aufnahme garantiert nicht ausgelöst werden, bevor das Script nicht zu Ende war.
    Gerade Nachts könnte es sein, dass die Kamera gut 30 Sekunden belichtet, dann wäre bei einem festeingestellten Intervall die Zeit zu kurz.

    Vielen Dank schonmal ...

    • Official Post

    Ich verstehe das Problem nicht so richtig.. Wie wäre es mit einer Schleife und einem sleepin der dslr.sh, wenn Dir eine Minute zu lang ist? Somit würde sich das Skript nicht beenden und müsste nur einmal beim booten gestartet werden.

    Oder habe ich Dich völlig falsch verstanden? :conf:

  • Meine DSLR macht bei einer Timelapse z.B. 1 Bild pro 10 Sek. Wenn das Bild (6 MB) dann auf der internen SD angekommen ist, wird es auf den Raspberry kopiert. Soweit ist das GPHOTO2. Ich kann dann nur dieses Bild nehmen und es dann 1. durch Image Magick schicken, umbearbeitet lassen und dann es kopieren und 2 x speichern. 1x für die Ansicht im WEB (immergleicher Name) 1 x für die Timelapse mit fortlaufender Nummer bzw. Date. Zum Ausführen brauchen GPhoto2 und dann meine .sh ca. 8 Sekunden bis EXIT=0. Wenn ich aber mal eine dunklere Phase habe, dann geht die Autobelichtungszeit nach oben, manchmal bis zu 30 Sekunden oder mehr. Dann sollte das Script nicht schon nach 10 Sekunden erneut starten, sondern am Besten warten bis das Exit=0, also meine .sh durchlaufen ist. Dynamisch könnte man es so steuern, dass egal wie lange die Belichtung dauert, das Script startet 10 Sek. nach dem Durchlauf (Exit=0) erneut. Hier ist auch mal das Script :) Vielleicht hat jemand Verwendung ....


    #!/bin/bash NOW=$(date +"%d-%m-%Y-%H-%M-%S") 

    gphoto2 --force-overwrite --capture-image-and-download --filename "aktuell.jpg" 

    convert -undercolor Black -pointsize 60 -fill grey -draw "text 30,50 \"$(date)\$ cp aktuell.jpg /home/pi/Public/aktuell.jpg 

    mv aktuell.jpg $NOW.jpg 

    echo $?


    :cool:

    • Official Post

    Sowei so klar, aber wozu das zweite Skript, wenn Du das alles in eins packen kannst? Erstelle eine Endlosschleife, verknüpfe die Befehle mit && Operatoren und füge am Ende der Schleife ein sleep 10 ein. Ggf. kann man auch if-else Abfragen fürs debugging einfügen.


    Btw. für mehrzeiligen Code ist der </> Button besser geeignet.