Time-lapse avec Raspberry Pi et sa (Pi)caméra

Posté le par | Réponse(s) : 12

Le printemps est là (il était temps...) et vous avez envie d'immortaliser cette belle période sous la forme d'un time-lapse ou de tester d'autres fonctionnalités de votre Raspberry Pi et son module caméra (RasPiCam). Ce billet vise donc à montrer comment utiliser le module caméra pour faire un time-lapse :  prise de photos à intervalles réguliers, puis assemblage de toutes ces images sous forme de vidéo avec l'outil memcoder. Pour celles et ceux qui souhaiteraient se lancer dans le time-lapse mais qui n'ont pas (encore ?) le module dédié mais qu'une webcam, pas de panique, ce billet répondra aussi à vos attentes.

Munissez-vous de votre module caméra couplé au RPi (Raspbian), d'une alimentation et d'un dongle Wi-Fi (facultatif). Je considère que le RPi est prêt à l'emploi. Si ce n'est pas le cas, ce précédent article expliquera tout en détail, pour la mise en œuvre de la RasPiCam c'est ici.

La RasPiCam est placée derrière une fenêtre, maintenue par du ruban adhésif. Le RPi, sous tension, n'attend plus que les directives qui seront données via SSH depuis mon bureau.

Première méthode : le script

Cette méthode "bidouillage" a l'avantage de faire intervenir un script comprenant un certain nombre de commandes mais a le gros inconvénient de ne s'arrêter que manuellement. Il faut donc appuyer simultanément sur les touches Ctrl et C pour arrêter le script.

On va tout d'abord penser à faire un travail "propre" et créer des dossiers pour archiver les photos :

mkdir /home/pi/timelapse/
cd /home/pi/timelapse/

Dans le dossier /home/pi/timelapse/ nous allons créer notre script timelapse.sh

nano timelapse.sh

Copier les lignes suivantes :

SAVEDIR=/home/pi/timelapse/
while [ true ]; do
filename=-$(date -u +"%d%m%Y_%H%M-%S").jpg
/opt/vc/bin/raspistill -o $SAVEDIR/$filename
sleep 4;
done;

La commande raspistill est utilisée pour capturer des images fixes, le processus prend environ 6 secondes pour s'achever. Les images nommées de leur timestamp respectif (horodatage) dans le dossier de sauvegarde. Puis, après une pause de 4 secondes, le script s'exécute à nouveau.

Seconde méthode : les options raspistill

Cette méthode est finalement beaucoup plus simple et plus "propre" que la première. En effet elle se résume par une seule commande exécutée grâce à l'option -tl correspondant à l'intervalle de temps séparant la prise des photos.

Donc si vous souhaitez prendre un instantané toutes les 12 secondes durant une période de 4 heures avec la résolution proposée par défaut (images en jpg, haute résolution, pas de correction), il vous suffira de taper :

raspistill -o timelapse_%d.jpg -tl 12000 -t 14400000

-o : fichier de sortie
-tl : intervalle de temps séparant la prise des photos (en millisecondes), ici 12x1000=12000
-t : durée de la période de captures (en millisecondes), ici 4x60x60x1000=14400000

Pour affiner avec plus de précision les paramètres, une liste des options est disponible sur github ou sur modmypi.

Méthode avec une webcam classique USB

Pour faire du time-lapse sa webcam, c'est tout aussi simple. Il suffit d'installer le logiciel fswebcam (plus de détails).

sudo apt-get install fswebcam

Puis lancer la commande :

fswebcam -l 10 /dossier/dédié/à/ces/images/timelapse-%Y-%m-%d--%H-%M-%S.jpeg

fswebcam prendra une photo toutes les 10 secondes dans le dossier choisi et au nom timelapse horodaté.

Même inconvénient que pour la première méthode utilisant la RasPiCam, il faut appuyer simultanément sur les touches Ctrl et C pour arrêter le programme ou taper en console :

pkill fswebcam

L'assemblage vidéo avec memcoder

Quelque soit la méthode employée, on obtient des centaines d'images que l'on doit maintenant mettre bout à bout pour obtenir une vidéo. Pour cela, memcoder, un petit programme aux grosses capacités, va nous aider dans cette tâche.

On l'installe et on lit la doc pour connaître toutes les options.

sudo apt-get install mencoder

Afin de lister toutes les images dans un fichier qu’on passera comme source en paramètre à mencoder, on se positionne dans le dossier des images (/home/pi/timelapse/ dans notre exemple) :

cd /home/pi/timelapse/
# on liste le contenu
ls > ../liste_photos.txt

liste_photos.txt doit être présent dans le dossier /home/pi/

On assemble maintenant toutes les images :

sudo mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=1920:1080 -o mon_timelapse.avi -mf type=jpeg:fps=24 mf://@../liste_photos.txt

L'encodage se fait en mode bavard, aussi le processus sera détaillé en console. Ceci peut durer longtemps, voire très longtemps si la durée de capture a été longue. On peut aussi rapatrier le dossier images sur son ordinateur de bureau via FTP et les traiter plus rapidement.

J'ai fait un test rapide et sans prétention, les prises de vue ont été effectuées de 4h45 à 8h30 :

Le prochain time-lapse sera en mode mobile...

Source image à la une


Licence Creative Commons
Cet article, sauf mention contraire expresse, est publié sous licence Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported Licence.

Vous avez aimé cet article ? Alors partagez-le avec vos amis en cliquant sur les boutons ci-dessous :
Google Plus Twitter Facebook Linkedin Framasphere email Flattr !

12 commentaires sur “Time-lapse avec Raspberry Pi et sa (Pi)caméra

  1. Pingback: Le premier film de la caméra pi : Un coucher de soleil au Creusot | Framboise 314, le Raspberry Pi à la sauce française….

  2. Salut, merci pour toutes ces explications fortes intéressantes !

    Néanmoins, en voulant faire le timelapse, pas moyen de prendre plusieurs photos, par exemple avec la commande suivante :

    raspistill -o /tmp/img_`date "+%k_%M_%S"`.jpeg -tl 60000 -t 7200000

    Je voulais prendre une photo toutes les minutes pendant 2H, et le seul fichier capturé sort au bout d'une minute.. Aucun autre fichier généré ensuite.

    Une idée ?

    • Plop Isador. Effectivement, raspistill ne tient malheureusement pas compte des commandes date et c'est bien dommage alors que fswebcam (ne fonctionne pas pour l'instant avec la PiCam) en tient compte. J'espère que les options "date" seront implémentées rapidement. Pour le moment il faut se contenter de %d pour les prises en time-laspe.
      Pour des prises à intervalle plus grandes (supérieures à une minute), j'ai contourné ce manque par la création d'un script shell lancé à intervalle par cron (toutes les x minutes/heures/etc.) dans lequel on exécute raspistill avec les options souhaitées et on copie l'image nouvellement créée libellé avec timestamp :

      Script timestamp.sh :

      #!/bin/sh
      time=$(date +"%Y-%m-%d-%H%M")
      cd /home/pi/Webcam
      raspistill --output image.jpg
      cp /home/pi/Webcam/image.jpg /home/pi/Webcam/image-$time.jpg
      

      Lancé avec cron toutes les 5 minutes :

      */5 * * * * /home/pi/Webcam/timestamp.sh
      

      Je sais que l'on peut exécuter cron toutes les x secondes (ne le fait pas par défaut), pour cela il y a des tutos ici et . Il faut noter que cron n'a pas été créé pour une exécution à une fréquence à la seconde et risque de consommer énormément de ressource CPU/RAM et de rendre le Pi instable, à tester...

  3. bonjour je voudrais faire un time lapse mais ma caméra crée plusieurs dossiers j'ai par exemple 3000 photos et ma caméra crée 3 dossiers cependant avec n'importe quel logiciel je ne peux pas faire un time lapse parce que pour moi il faut juste un dossier pour faire un time lapse. Alors si il existe une solution pour regrouper mes 3 dossiers ensemble en un merci de me dire comment.

    • Bonjour, si j'ai bien saisi le soucis, lorsque tu lances le script, plusieurs dossiers contenant les images capturées sont créés. Vérifie les étapes que j'énonce dans cet article. Si tu as suivi "à la lettre", tout devrait se passer correctement. Si tu veux regrouper les images de chaque dossier dans un seul, tu peux utiliser les commandes :
      mkdir /home/pi/dossier_photo
      cp /home/pi/dossier/ou/se/trouve/ton/dossier1/*.jpg /home/pi/dossier_photo
      cp /home/pi/dossier/ou/se/trouve/ton/dossier2/*.jpg /home/pi/dossier_photo
      cp /home/pi/dossier/ou/se/trouve/ton/dossier3/*.jpg /home/pi/dossier_photo

    • Avec ton Raspberry Pi, tu peux gérer, organiser tes fichiers/dossiers en mode graphique et dans un terminal (ou console).
      En mode graphique, tu ouvres ton explorateur de fichiers, tu peux créer/supprimer/copier/coller des fichiers et des dossiers.
      En ligne de commandes, tu dois ouvrir le Terminal et utiliser des commandes. Visiblement tu n'es pas familiarisé avec le terminal, aussi je te conseilles d'organiser tes dossier en mode graphique comme tu le ferais sous Windows.
      Pour mieux connaitre l'environnement de ton RPi, je te conseille la lecture de ces articles : comprendre l'environnement Linux et les commandes de références Unix/Linux. L'environnement Linux n'est pas compliqué, mais il faut connaitre les bases, avec ces notions, tu verras que c'est facile et rapide d'utilisation. Tu peux aussi lire ce bon article de sebsauvage. Ne te décourage pas, on peut réellement faire des trucs chouettes avec Linux 😉

  4. bonjour,
    j'ai suivi toutes les étapes en faisant un essai d'une minutes, soit donc 7 images.
    Le fichier vidéo se crée parfaitement mais il est impossible de le lire, que ce soit avec vlc ou mplayer.
    Mplayer se lance et n'affiche rien.
    LVC se lance puis donne un aperçu noir pendant quelques secondes avant d'afficher la première image et rester bloquer dessus (ctrl+alt+supp pour stopper le process).
    Mplayer et VLC sont installés nativement, sans aucun greffon supplémentaire.
    Quelqu'un aurait une solution ?
    Merci et bonnes fêtes de fin d'année

  5. Merci beaucoup pour ce tuto très bien expliqué, initialement j'étais partis sur une solution à base de motion (le logiciel de détection de mouvement), mais c'était vraiment la galère (notamment pour trouver une version compatible avec le module raspicam), même si le fichier vidéo était assemblé automatiquement. Avec ta solution au moins je contrôle chaque étape de la création du timelapse.

Répondre à johan Annuler la réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.