Zeitrafferaufnahmen mit dem RaspberryPi Version 2

Ich habe dieses alte Skript um Zeitrafferaufnahmen zu erstellen ein wenig Erweitert.

Was ist neu ?

Es ist nun möglich direkt beim Aufruf des Skriptes die folgenden Optionen zu übergeben:

  • -n Dateiname der erzeugten Einzelbilder
  • -o Zielverzeichnis
  • -i Intervall zwischen den Einzelbildern in Sekunden
  • -d Aufnahmedauer in Tagen
  • -h Aufnahmedauer in Stunden
  • -m Aufnahmedauer in Minuten
  • -s Aufnahmedauer in Sekunden
  • –width=xxx Auflösung der Bilder, Breite (bedingt durch die Kamera max. 2592 Px)
  • –height=xxx Auflösung der Bilder, Höhe (bedingt durch die Kamera max. 1944 Px)

Die Optionen können Beliebig kombiniert werden, oder auch weggelassen werden.
Im falle von weggelassenen Optionen werden hierfür Default Werte genommen, diese sind:

  • Dateiname = timelapse
  • Zielverzeichnis = Aktuelles Verzeichnis
  • Intervall = 15s
  • Aufnahmedauer = 900s
  • Auflösung = 1280×720

Weiterhin werden nun die Intervalle nicht mehr über ein Unterbrechen des Skriptes erreicht (Dies war in Verbindung mit der Auslösezeit der Kamera doch sehr ungenau und schlecht berechenbar).
In dieser Version wird die Systemzeit des RaspberryPi’s verwendet um zu Ermitteln wann der Intervall abgelaufen ist. Dadurch ist auch bei Wochenlangen Zeitrafferaufnahmen Sichergestellt, dass die einzelnen Bilder immer im Passenden Zeitabstand aufgenommen werden und nachher auch die Gesamte Anzahl der Bilder passt.

Python3 Skript

#!/usr/bin/python3

# Dieses Skript dient zur Erstellung von Zeitrafferaufnahmen mit dem Raspberry Pi.
# Das Skript speichert die Einzelbilder im Zielordner des Skriptes und löscht vor dem aufnehmen neuer Bilder
# zunächst alle Bild Dateien mit gleichen Namen (Daran Denken !).
# tl_name ist der Dateiname der Erzeugten Bilder, dort wird noch ein Zähler angehangen.
# Die Einstellung welche man benötigt testet man am besten vorher durch ausprobieren mit raspistill aus.

from sys import *
import getopt
import os
from time import *
import subprocess
import math
 
# Funktion zum löschen aller *.jpg Dateien die das Pattern enthalten.
def loeschen(path, pattern):
	for each in os.listdir(path):
		if (each.find(pattern) != -1 & each.find("jpg") != -1):
			name = os.path.join(path, each)
			try: 
				os.remove(name)
				print(name + " wurde gelöscht.")
			except:
				print("Löschen fehlgeschlagen")
				pass
	print("Alle Bilder erfolgreich gelöscht\n")

# Initialisierung der Parameter mit default Werten:
# Name für die Bilderreihe.
path = "./"
tl_name = 'timelapse'

# Kamera Einstellungen:     (siehe raspistill Manpage für genauere Infos)
# Exposure mode options :
# off,auto,night,nightpreview,backlight,spotlight,sports,snow,beach,verylong,fixedfps,antishake,fireworks
photo_ex  = 'sports'
# AWB mode options :
# off,auto,sun,cloud,shade,tungsten,fluorescent,incandescent,flash,horizon
photo_awb = 'auto'
# Image Effect mode options :
# none,negative,solarise,sketch,denoise,emboss,oilpaint,hatch,gpen,pastel,watercolour,film,blur,saturation,colourswap,washedout,posterise,colourpoint,colourbalance,cartoon
photo_effect = 'none'
# EV Level.
photo_ev = 0 
# Auflösung und Qualität (max 2592 x 1944).
photo_width  = 1280
photo_height = 720
photo_quality = 90

# Zeitraffer Einstellungen:
# Intervall zwischen den Fotos (Sekunden).
photo_interval = 15
# Dauer das gesamten Videos (Sekunden).
duration = 900
newDuration = 0
# Anzahl Fotos Gesamt.
total_photos = 0


# Kommandozeilen Optionen mit getopt ermitteln:
# Optionen:
# -n 
# -o 
# -i 
# -d 
# -h 
# -m 
# -s 
# --width=
# --height=
try:
  opts, args = getopt.getopt(argv[1:], 'n:i:q:d:h:m:s:o:', ["width=","height="])
except getopt.GetoptError:
  print("timelapse.py3 -n  -i  -d  -h  -m  -s  --width= --height=")
  exit(2)
for opt, arg in opts:
        if opt == "-n":
                if arg != "": tl_name = arg
        if opt == "-o":
                if arg != "":
                        if(os.path.isdir(arg)):
                                path = arg
                        else:
                                print("Incorrect Output Directory")
                                exit()
        if opt == "-i":
                if arg != "":
                        try:
                                interval = int(arg)
                        except:
                                print("Only numbers for interval")
                                exit()
                        if(interval < 1):
                                print("Interval has to be at least 1s")
                                exit()
                        else: photo_interval = interval
        if opt == "-q":
                if arg != "":
                        try:
                                qty = int(arg)
                        except:
                                print("Only numbers for quality")
                                exit()
                        if (qty < 0 or qty >100):
                                print("quality must be in range of 0 to 100")
                                exit()
                        else: photo_quality = qty
        if opt == "-d":
                if arg != "":
                        try:
                                days = float(arg)
                        except:
                                print("Only Numbers for duration (days)")
                                exit()
                        newDuration += (days * 24 * 60 * 60)
        if opt == "-h":
                if arg != "":
                        try:
                                hours = float(arg)
                        except:
                                print("Only Numbers for duration (hours)")
                                exit()
                        newDuration += (hours * 60 * 60)
        if opt == "-m":
                if arg != "":
                        try:
                                minutes = float(arg)
                        except:
                                print("Only Numbers for duration (minutes)")
                                exit()
                        newDuration += (minutes * 60)
        if opt == "-s":
                if arg != "":
                        try:
                                seconds = float(arg)
                        except:
                                print("Only Numbers for duration (seconds)")
                                exit()
                        newDuration += seconds
        if opt == "--width":
                if arg != "":
                        try:
                                width = int(arg)
                        except:
                                print("Only Numbers for Width")
                                exit()
                        if (width < = 0 or width > 2592):
                                print("Width must be in range of 1 to 2592")
                                exit()
                        else: photo_width = width
        if opt == "--height":
                if arg != "":
                        try:
                                height = int(arg)
                        except:
                                print("Only Numbers for Height")
                                exit()
                        if(height < = 0 or height > 1944):
                                print("Height must be in range of 1 to 2592")
                                exit()
                        else:   photo_height = height
# Prüfen ob mit dem Kommandozeilen Argumenten eine neue gültige Aufnahme dauer eingestellt wurde.
if newDuration > 0:
        duration = int(newDuration)
elif newDuration < 0:
        print("Negative Interval")
        exit()

# Wenn der Intervall größer ist wie der Aufnahmezeitraum wird beendet        
if (photo_interval > duration):
        print("Interval is bigger than the duration")
        exit()

# Alle eventuell vorhandenen gleichnamigen Bilder Löschen.
try:
  loeschen(path, tl_name)  
except OSError:
  print(OSError)
  pass
 
# Fotos machen!
try:
  photo_counter = 1

  startTime = time()
  timeNextPic = startTime + photo_interval
  # Endzeit des Videos Berechnen
  endTime = startTime + duration
  total_photos = math.ceil(duration / photo_interval)
  
  print("Raspistill Einstellungen:")
  print("Dateinamen:       " + tl_name)
  print("Belichtung:       " + photo_ex)
  print("Weißabgleich:     " + photo_awb)
  print("Effekt:           " + photo_effect)
  print("EV:               " + str(photo_ev))
  print("Auflösung:        " + str(photo_width) + "x" + str(photo_height))
  print("jpg Qualität:     " + str(photo_quality))
  print("Beginn:           " + strftime("%d.%m.%Y - %H:%M:%S",localtime(int(startTime))))
  print("Intervall:        " + str(photo_interval) + "s")
  print("Ende:             " + strftime("%d.%m.%Y - %H:%M:%S",localtime(int(endTime))))
  print("Dauer:            " + str(duration) + "s")
  print("Anzahl Bilder:    " + str(total_photos))
  print("Restzeit am Ende: " + str(duration - ((total_photos-1) * photo_interval)) + "s")
  print("\nFotoserie gestartet !\n")

  startTime = time()
  timeNextPic = startTime + photo_interval
  # Endzeit des Videos Berechnen
  endTime = startTime + duration
  
  # Solange die End Zeit noch nicht erreicht ist werden Bilder gemacht:
  while(time() < = endTime):      
      filename = (path + tl_name + "_%.4d.jpg"%photo_counter)
      cmd = ('raspistill -t 250 -w ' + str(photo_width) +
            ' -h ' + str(photo_height) +
            ' -q ' + str(photo_quality) +
            ' -awb ' + photo_awb +
            ' -ev ' + str(photo_ev) +
            ' -ex ' + photo_ex +
            ' -ifx ' + photo_effect +
            ' -o ' + filename +
            ' -n ')
      #print(cmd)
      pid = subprocess.call(cmd, shell=True)
      
      # Berechnung der Verbleibenden Zeit.
      rest_sekunden = endTime - time()
      
      rest_zeit = rest_sekunden
      einheit = " Sekunden"
      if rest_sekunden > 86400:
          rest_zeit = rest_sekunden/86400
          einheit = " Tage"
      elif rest_sekunden > 3600:
          rest_zeit = rest_sekunden/3600
          einheit = " Stunden"
      elif rest_sekunden > 60:
          rest_zeit = rest_sekunden/60
          einheit = " Minuten"

      # Statusmeldung ausgeben.
      print(strftime("|- %d.%m.%Y - %H:%M:%S\n") + '|      [' +
        str(photo_counter) + ' von ' +
        str(total_photos) +
        '] ' + filename + '   ' +
        "%.2f"%rest_zeit + einheit + ' verbleibend.')
      # bis der nächste intervall abgelaufen ist:
      while(time() < = timeNextPic):
        sleep(0.25) # CPU Last senken
        pass
      timeNextPic += photo_interval
      photo_counter += 1
 
  print("Fotoserie beendet")
 
except KeyboardInterrupt:
  # Abbruch durch den Benutzer.
  print("\nAbgebrochen!")

timelapseV2

Beispielhafter Aufruf

Um eine Zeitrafferaufnahme auf einen USB Stick, welcher im Ordner /home/pi/USB gemountet ist, über 2 Tage, 5 Stunden und 15 Minuten mit einem Intervall von 30 Sekunden zwischen den Aufnahmen und dem Dateinamen Zeitraffer zu erstellen lautet der Befehl:

nohup python3 -u ./timelapse.py3 -n Zeitraffer -o ~/USB  -i 30 -d 2 -h 5 -m 15 | tee ausgabe.txt &

Dabei werden dann Bilder in der Auflösung 1280x720 Px erzeugt, da diese Optionen weggelassen wurden.

Wie man aus den Bildern ein Video erstellt steht in dem alten Beitrag.

Links

Ein Gedanke zu „Zeitrafferaufnahmen mit dem RaspberryPi Version 2

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.


*