Referencia Rápida: Animaciones GIF con Raspberry PI, Python e Imagemagick

Como parte de un proyecto escolar sobre la descomposición de las frutas, recientemente realizamos con mi hijo un proyecto para dejar descomponer un par de frutas por una semana y tomar una foto diaria. Decidimos mejor tomar una foto cada hora y ver las frutas descomponerse en un minuto.

Es un proyecto muy simple para capturar fotografías en modo time-lapse; así podemos armar un video (GIF) de 10 segundos que resume algo que sucedió en una semana.

El proyecto se describe en detalle en la página de proyectos de Raspberry PI , del cual presentamos acá un resumen.

En general consta de los siguientes pasos:

  1. Configurar y conectar un Raspberry PI con su respectiva cámara.
  2. Realizar un pequeño programa que toma una foto cada cierto tiempo usando el lenguage Python y el editor que viene incluido en el sistema operativo del Raspberry PI.
  3. Convertir un conjunto de imágenes en un GIF animado usando las herramientas de la paqueteria imagemagick.
  4. Comprimir el archivo GIF para hacerlo mas transportable por Internet. Dado que acabamos con un archivo de 26MB, decidimos pasarlo por ILoveImg que lo dejó en 9MB. También se puede comprimir usando ImageMagick.

Seguidamente les mostramos el código, los comandos y el resultado.

Haga clic aquí para ver el programa de Python que generamos
#!/usr/bin/python3

# Decidimos no usar la librería PiCamera 
# y mejor usar llamdas de sistema al utilitario raspistill
# con el fin de poder cambiar facilmente el modo de exposición
# dependiendo de la hora.

from os import system
from time import sleep
import datetime

sleep(3)
print ("Camara lista. Resolucion 1024x768")

system("raspistill -ex sports -w 1024 -h 768 -o test.jpg")
counter = 0
minuteTaken = 0 
hourTaken=0
sevenfourTaken = 0 

minCounter=0
hourCounter=0
h74Counter=0

while True:
    now = datetime.datetime.now()
    counter += 1
    i = counter
    year=str(now.year)
    month=str(now.month)
    day=str(now.day)
    hour=str(now.hour)
    minute=str(now.minute)

    month= ("0" if now.month <10 else "")  + month
    day  = ("0" if now.day   <10 else "")  + day
    hour = ("0" if now.hour  <10 else "")  + hour
    minute=("0" if now.minute<10 else "")  + minute
    
    filestamp = year+month+day+hour+minute

    raspicmd = ""
    if (now.hour<6 or now.hour >17):
        raspicmd = "raspistill -ex night -w 1024 -h 768  -o "
    else:
        raspicmd = "raspistill -ex sports -w 1024 -h 768  -o "
    
    if now.second == 0:
        if minuteTaken == 0:
            minCounter +=1
            print ("Capturando imagen por minuto: " + filestamp)
            system(raspicmd + "image_min" + filestamp + ".jpg")
            minuteTaken = 1
    else:
        minuteTaken=0
    
    if now.minute==0:
        if hourTaken==0:
            hourCounter +=1
            print ("Capturando imagen por hora: " + filestamp)
            system(raspicmd + "image_hour" + filestamp + ".jpg")
            hourTaken=1
    else:
        hourTaken=0

    
    if now.hour==7 or now.hour == 16:
        if sevenfourTaken==0:
            h74Counter+=1
            print ("Capturando imagen por 7am 4pm: " + filestamp)
            system(raspicmd + "image_h74" + filestamp + ".jpg")
            sevenfourTaken = 1
    else:
        sevenfourTaken = 0

#FIN

 

Haga clic aquí para ver los comandos para generar el GIF

Los siguientes comandos de imagemagick en Linux crearán los archivos GIF.

En nuestro caso, el primer comando no funcionó por que eran demasiadas fotos para unir (10000) en una resolución no pequeña.
El segundo comando funcionó bien, y el resultado es la imagen que mostramos en esta publicación.

convert -delay 20 -loop 0 image_min*.jpg animation_min.gif
convert -delay 20 -loop 0 image_hour*.jpg animation_hour.gif
convert -delay 20 -loop 0 image_h74*.jpg animation.gif_h74

 

Haga clic aquí para ver el GIF que generamos

 

143 total views, 1 views today

5Shares

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.