Picamera bilder sollen hochzählen

  • Hi leute,
    ich hoffe ihr könnt mir weiterhelfen..........


    Vorn weg. Hab mir von Rheinwerk das Buch Rasperri 3 in neuester Auflage gekauft doch leider scheint es mit den Programmen zwischen Python 2 und meiner aktuell verwendeten Version Python 3.4.2 Probleme zu geben den die angegeben Beispiele über counter/timestamp ect scheinen in Verbindung mit den "{" nicht funktionieren zu wollen.


    zu meinem eigentlichen Problem :


    Habe einen Taste an die GPIO´s angeschlossen und auch mein Programm macht was es soll.


    Was ich allerdings mit meiner verwendeten version 3.4.2 von Python nicht hinbekomme ist,
    das entweder die bilder einen Zeitstempel bekommen oder was auch gehen würde als Endprodukt ist das die Bilder bei neuem tasten druck nicht überschrieben werden sondern das 5 bilder gemacht werden dann bei 6-11 usw weitergezählt wird.


    Habe keine ahnung wie ich das schreiben muss..


    hier mal mein Programm :


    #!/usr/bin/python3
    #-*- coding: utf-8 -*-


    import os
    import sys
    import time
    import datetime
    import RPi.GPIO as GPIO
    import picamera


    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(13,GPIO.IN,pull_up_down=GPIO.PUD_DOWN) #5 Bilder werden bei Tastendruck gemacht
    filenames = [ 'Schuetze%02d.jpg' % i for i in range (5) ] # Range = Anzahl der Bilder die gemacht werden sollen



    while 2: #while 2 daher da es noch mehr schleifen gibt
    if GPIO.input(13)==GPIO.HIGH:
    cam = picamera.PiCamera()
    cam.capture_sequence(filenames)
    cam.close()
    GPIO.cleanup()



    so wie gesagt das funktioniert es sollte nur so sein das bei weiterem Tastendruck entweder die bilder ab 5 weiter gezählt werden oder ohne das das einfach ein zeitstempel dabei ist


    vielen dank schonmal


    lg

  • Du musst das Array mit den Filenames in jedem Schleifendurchlauf neu setzen.
    Die Zuweisung muss in die Schleife und du brauchst eine Variable (x), in der steht, wie die bisher höchste Bildnummer ist, damit du die Filenames entsprechend weiterzählen kannst: range (x,x+5).

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • Hallo


    1)
    Verwende das gpiozero Modul, welches viel anfängerfreundlicher ist:
    https://gpiozero.readthedocs.i…#button-controlled-camera


    2)
    Zitiere ich mich mal selber, weil es hier um ein ähnliches Problem geht:

  • ok schonmal vielen dank..


    ok was ich bis jetzt probiert war anhand zich beispielen timestamp in den image namen einzubauen und meine for schleife so um zu schreiben wie ich zumindest gedacht hätte es geht..


    da es nicht ging hab ich die dateien wieder gelöscht..


    ich versuchs nochmal mit deinen links und behalte diesmal die dateien und melde mich dann obs geklappt hat


    danke schonmal

  • mh ok


    also wie es am ende ist is eigentlich egal


    entweder variante 1 : pro tasten druck sollen 5 bilder gemacht (was ja bereits funktioniert) und dann bei neuem tasten druck ab 5 aufwärts nochmal 5 bilder gemacht werden usw


    oder variante 2 : pro tasten druck 5 bilder die zeit dazu (somit erhält ja des bild nen eigenen datei namen)


    hauptsache die bilder werden nicht immer überschrieben dann wäre ich schonmal glücklich :-)

  • Wenn das Programm neugestartet wird, musst du bei Variante 1 dir eine Funktion schreiben, die dir das Bilderverzeichnis ausliest und die Dateinamen merkt. Den höchsten Wert wird um eins erhöht und das Zähler verwendet, da der Platzhalter von picamera ``{counter}`` wieder von ein beginnt.


    http://picamera.readthedocs.io…Camera.capture_continuous


    Mit Datum wäre es für einen Anfänger leichter ;)
    `` '{:%Y-%m-%d_%H-%M-%S}.jpg'.format(datetime.now())``

  • weil mir langweilig war, hab ich mal ein Programm geschrieben, dass die Bilder hochzählt und nach einem Neustart weiter zählt.
    Normalerweise ist das nicht meine Art, fertige Programme hinzuklatschen aber Schützen brauchen in dieser abartigen Zeit jegliche Unterstützung ;)
    Darum gehst du es über die Osterferien Stück für Stück durch und versuchts zu begreifen, was da abgeht!

  • super danke dir :-)


    naja das mit den Schützen kam wohl falsch rüber :-/


    das ganze soll eine Fotoschiesanlage für den Rummelplatz/Kirmes werden


    der "Schütze" ist in dem fall der Kunde

  • Ich greif mal dein eigentliches Anliegen auf, streich aber den PiCamera Krams raus - damit du vielleicht deinen Fehler besser verstehst:



    [/quote]
    Seine get_start_value() Funktion ermittelt die Dateien in dem Verzeichnis. Wenn also bisher die Dateien Schuetze01.jpg, Schuetze02.jpg und Schuetze03.jpg erstellt wurde gibt get_start_value() die Datei Schuetze03.jpg zurück.. Leider funktioniert die spätere Verarbeitung mit bootsmann's Code dann nicht mehr so wie es sein sollte, aber das richtig zurecht zu basteln kriegt man auch noch hin ;)



    Zusätzlich könnte man noch ein Problem aufführen: Du verwendest "Polling" für die GPIO's, was aber nicht so präzise ist und mehr CPU Auslastung zur Folge hat.
    Denn so wie das Script zZt aussieht wird nur dann reagiert wenn GPIO#13 auf HIGH ist, andernfalls rotiert die while extrem schnell und verursacht nahezu 100% CPU Auslastung - sehr schlecht.
    Desweiteren blockiert das "Bild aufnehmen" die Schleife. Wird also gerade ein Foto aufgenommen und genau in dieser Zeit der Taster gedrückt, wird das nicht registriert und das Event geht verloren.





    PS: Dein Beitrag ist etwas verwirrend da du erst von einem Problem mit " { " sprichst aber dazu dann keinen Code oder Fehlermeldung zeigst.

  • hi


    Erstmal vielen dank für Erklärung.. top!


    zumindest war ein kleiner Teil aus dem buch. Hab dann mit hilfe von Google, dem Forum hier einfach so lange dran gebastelt bis das Programm das gemacht hat was es tun soll.


    zu der "{" das war auch mal ein versuch mit timestamp zu arbeiten im Namen der image datei was aber warum auch immer nicht funktioniert. halb so wild mittlerweile


    Das mit dem einrücken is so..ich schreib das ganze in der IDLE Python 3 die schon auf dem Rasperri mit drauf war. da hatte ich so eingestellt das 4 einrücken genommen werden sollen.. das programm schreibt ja dann bei jeder zeile ">>>>" davor..was ich nach dem speichern und vor dem ausführen ja wieder löschen muss weil sonst Syntax fehler kommt.


    Hab es jetzt soweit hinbekommen das die Bilder nicht mehr überschrieben werden und weitergezählt werden allerdings auf eine andere Art.


    Mein code sieht nun so aus:


    import picamera
    import RPi.GPIO as GPIO


    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(13,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
    Taster2 =13


    x=0
    filenames = [ 'Schuetze%02d.jpg' % i for i in range (x, x+5) ]


    while 2:
    if GPIO.input13)==GPIO.HIGH:
    filenames = [ 'Schuetze%02d.jpg' % i for i in range(x, x+5) ]
    x=x+5
    cam = picamera.PiCamera()
    cam.capture_sequence(filenames)
    cam.close()
    GPIO.cleanup



    also soweit so gut es werden pro Tastendruck 5 bilder gemacht und bei erneutem Tastendruck werden weitere 5 bilder gemacht und die dateien automatisch hochgezählt.. soweit bin ich zu frieden...


    CPU auslastung liegt bei 12%..in der Praxis später beudet ja 1 Tastendruck das der Schütze genau den Punkt auf der Zielscheibe trifft ..schätze mal das wird nicht oft passieren ^^ ....



    Zum endgültigen fertig stellen der Anlage fehlen mir noch zwei sachen.. Das erste was schön wäre aber auch kein zwingendes muss wenn das nicht geht ist das ich
    den Speicherort der gemachten bilder ändern kann..krieg ich nicht hin..wenn das nicht gegeben ist sollte das auch keine grose schwierigkeit darstellen


    was noch fehlt is ein weiterer Taster in einer for schleife der dann erst nach 10 maligem betätigen (sprich 10 schuss auf einen bestimmten bereich der Zielscheibe) ein weiteres foto macht...


    dann wärs fertig