Hallo,
ich versuche schon eine ganze Weile ein Bild per raspistill ... zu machen in einem Python-Script. Es will aber einfach nicht klappen. Ich bitte um Hilfe.
Bild per raspistill in Python
-
chico0408 -
1. April 2015 um 13:00 -
Erledigt
-
-
Bild per raspistill in Python? Schau mal ob du hier fündig wirst!
-
Mit ``subprocess.call()`` oder noch besser mit picamera
-
Danke, das hat schon mal geklappt. Allerdings werden die Bilder immer wieder überschrieben. Weißt du zufällig wie man dort einstellt, dass die Bilder durchnummeriert werden.
MfG. chico408
-
Wenn du fortlaufend Bilder machen willst ohne das Programm zu beenden, dann steht die Lösung auch in der Doku:
Code
Alles anzeigenimport time import picamera with picamera.PiCamera() as camera: camera.resolution = (1280, 720) camera.start_preview() time.sleep(1) for i, filename in enumerate(camera.capture_continuous('image{counter:02d}.jpg')): print('Captured image %s' % filename) if i == 100: break time.sleep(60) camera.stop_preview()
Wenn du aber nur sporadisch Bilder machen willst mittels Programmaufruf, dann musst du halt zuerst Prüfen, wie die letzte Datei hieß und zählst eines dazu. Oder du speicherst die Werte ab etc. Einfacher wäre ein Datumstempel...
-
Hallo,
erstmal Danke. Allerdings macht dies dauerhaft Bilder. Es soll nur auf einen Bewegungsmelder reagieren. Ich habe es nun wie folgt gelöst:Code
Alles anzeigen# coding=utf-8 import time, sys import RPi.GPIO as GPIO import picamera import datetime GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) def motion(pin): print("Bewegung erkannt") with picamera.PiCamera() as camera: camera.capture('/home/pi/Desktop/Fotos/'+'{:%d.%m %H_%M_%S}'.format(datetime.datetime.now())+'Uhr.jpg') return GPIO.add_event_detect(17, GPIO.RISING) GPIO.add_event_callback(17, motion) try: while True: time.sleep(0.5) except KeyboardInterrupt: GPIO.cleanup() sys.exit()
Falls Verbesserungsbedarf... Ich bin für Kritik offen.
-
-
Ok, danke. Habe ich verbessert.
-
Leerzeichen in Dateinamen sind schlecht und sollten vermieden werden.
Anzumerken wäre außerdem das es einen Unterschied zwischen python2 und python3 gibt. Der obige Code scheint für python3 zu sein und dann müsste picamera gesondert für python3 installiert werden - wenn es aber für python2 is sollten die print Zeilen geändert werden (komisch das bootsmann dazu nix sagte, sonst mecker er darüber doch auch immer :s)
datetime kann man sich ebenfalls sparen, da es im picamera bereits eine eingebaute 'Datei Benennung' dafür gibt, zwar nur für 'capture_continuous' aber mit einem simplen Trick dennoch hierfür verwendbar.
Und zu guter letzt verwendest du unterschiedliche Einrückungen: mal 4 Leerzeichen und mal 2 Leerzeichen. Auf eins von beidem solltest du dich festlegen
Bedeutet also das Script könnte wie folgt aussehen:
[code=php]
#!/usr/bin/python3
# coding=utf-8
import time, picamera, RPi.GPIO as GPIOPIR_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)def motion(pin):
print("Bewegung erkannt")
with picamera.PiCamera() as camera:
for filename in camera.capture_continuous('/home/pi/Desktop/Fotos/{timestamp:%d.%m_%H-%M-%S}Uhr.jpg'):
print('Captured %s' % filename)
breaktry:
GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=motion)
while True:
time.sleep(0.5)
except (KeyboardInterrupt, SystemExit):
GPIO.cleanup()
[/php]Es wäre aber auch ratsam gewisse Einstellungen vorzunehmen wie Auflösung, Qualität, Belichtungszeit usw oder vorher preview anzuwenden damit die Kamera Zeit hat zu initialisieren bzw das Bild zu stabilisieren - was letztlich alles die Bildqualität beeinflusst...
Beispiel:
Spoiler anzeigen
[code=php]
#!/usr/bin/python3
# coding=utf-8
import time, picamera, RPi.GPIO as GPIOPIR_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)def motion(pin):
print("Bewegung erkannt")
with picamera.PiCamera() as camera:
camera.resolution = (1024, 768)
# Start a preview and let the camera warm up for 2 seconds
camera.start_preview()
time.sleep(2)
for filename in camera.capture_continuous('/home/pi/Desktop/Fotos/{timestamp:%d.%m_%H-%M-%S}Uhr.jpg'):
print('Captured %s' % filename)
break
camera.stop_preview()try:
GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=motion)
while True:
time.sleep(0.5)
except (KeyboardInterrupt, SystemExit):
GPIO.cleanup()
[/php] -
Da nur ein Foto gemacht wird, ist das Verwenden einer for-Schleife sinnlos
-
Wenn du meinst... Dann schlag halt eine andere Lösung vor wie man den aktuell erstellten Dateinamen erhält, ohne 5 Zeilen Code einzufügen
Aber passt scho - deine Beiträge werde ich künftig einfach ignorieren
...im out...
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!