Caméra de surveillance et détecteur de mouvement avec un Raspberry Pi

Rasperry Pi 3 in camera case

J’ai commencé un petit projet évolutif avec une Raspberry Pi et une caméra. L’appareil me permet désormais de voir ce qu’il se passe chez moi en temps réel et de revisionner les moments de la journée où il y a eu du mouvement.

Je vais expliquer brièvement les différentes parties que j’ai implémentées et configurées afin d’obtenir mon propre vigile domestique.

Raspberry Pi

Un Raspberry Pi est un ordinateur dont la taille est comparable à celle d’une carte de crédit, dont le but initial était d’encourager les jeunes à s’initier à la programmation. Il ne coût qu’aux alentours de 30€ mais reste un ordinateur Linux complet, de plus, il ne consomme presque rien.

Rasperry Pi 3 et Camera V2

Motion

Motion est un programme qui surveille le signal vidéo d’une ou plusieurs caméra(s) et peut détecter si une partie importante de l’image à changé. En d’autres termes, il peut détecter les mouvement, sans avoir besoin d’un « vrai » appareil de détection de mouvement.

Je l’ai installé sur mon Raspberry Pi et l’ai configuré pour qu’il fonctionne avec la Raspberry Pi Camera V2. Cela m’a permis de diffuser ma caméra en direct sur mon réseau à l’aide d’un serveur web lighttpd, de protéger le visionnage par un mot de passe et d’enregistrer localement les vidéos des moments où un mouvement était détecté.

Le projet GitHub de Motion se situe ici, et voici une documentation très utile concernant le fichier de configuration de Motion.

Port Forwarding

Pour l’instant, ma caméra est seulement accessible localement. Pour pouvoir visionner ma caméra depuis n’importe où via Internet, j’ai activé le port forwarding de ma box vers mon Raspberry Pi (voir le schéma).

Désormais, je peux regarder la diffusion de ma caméra en direct depuis n’importe où grâce à mon smartphone.

Serveur Apache

Ma première intention avec cette caméra était de filmer mes rongeurs et mon chat en mon absence pour m’assurer que tout se passait bien. J’ai donc décidé d’installer un serveur Apache qui me fournirait un accès à toutes les vidéos des mouvements qui ont été sauvegardés.

J’ai configuré Motion pour déplacer les vidéos ainsi créées dans mon dossier Apache et j’ai adapté un plugin jQuery de galerie vidéo existant pour qu’il corresponde à mes besoins.

Seulement Motion générait une centaine de vidéos de plusieurs secondes/minutes par jour, et cela était compliqué de visionner l’ensemble des vidéos tous les jours.

Shell Script

J’ai donc eu l’idée de créer un script qui concatènerait toutes mes vidéos toutes les heures, et accélèrerait la vidéo finale x4. Vous trouverez un script qui fait partie de cette fonctionnalité ici, sur mon GitHub, et pour mieux comprendre comment tout cela fonctionne globalement vous pouvez consulter mon schéma résumé.

Désormais, je pouvais visualiser rapidement à tout moment un résumé de ce qui s’est passé dans la journée (en accéléré) en une seule vidéo (que j’ai nommé « overview »).

Planification des tâches

Pour automatiser ces opérations (déplacement des vidéos, construction de l’overview, suppressions des vieilles vidéos, mise à jour du système), j’ai utilisé Cron. Cela permet de lancer des scripts périodiquement à intervalles réguliers où à heures fixes. Vous trouverez un exemple de Crontab ici.

Support de caméra inclinable

Enfin, une dernière chose qui était particulièrement gênante à laquelle je devais remédier était le fait que je ne pouvais pas positionner et incliner la caméra comme je le voulais, n’ayant pas de support. J’ai donc été inspiré par Larry Page et Sergey Brin (les fondateurs de Google), qui utilisaient des LEGO pour construire le support de le tout premier serveur. C’est pas cher et très adaptable, à l’image de ma Raspberry Pi. 🙂

Ne peut pas voir au dessus du bureau 🙁 Maintenant oui 🙂
Camera without support Camera with support

Aperçu d’une vidéo « overview »

Vidéo exemple

Schéma résumé

Voici un schéma que j’ai fais pour vous aider à comprendre l’architecture de mon projet. Il me sera également utile lorsque je voudrai travailler à nouveau sur ce projet dans quelques mois et que j’aurai tout oublié. 🙂
(Bien sûr, j’ai changé les adresses IP et les numéros de ports, vilain garnement)
Schema thumbnail

Conclusion

Je ne prétends pas que c’est la meilleur solution et je sais que mes scripts peuvent être amélioré, je décris simplement et globalement la solution que j’ai déployé pour mon premier projet sur un Raspberry Pi. Je me suis beaucoup amusé à coder tout ça et je suis particulièrement fier d’avoir réussi à développer tout ce dont j’avais besoin.

Je ne suis pas beaucoup entré dans les détails au fil de cet article, alors si vous avez besoin de plus d’informations, n’hésitez pas à me laisser un commentaire. 🙂

 

2 thoughts on “Caméra de surveillance et détecteur de mouvement avec un Raspberry Pi

  1. Super blog Marti 🙂
    J’ai pour projet de filmer en continu pendant 24 heures puis arrêter la vidéo et en lancer une autre dans la foulée. Tous les deux jours, un script me supprime mes vidéos.

    Je suis en local dépourvu de toute source internet. Je souhaiterai à l’aide d’une caméra IP (protocole ONVIF), connectée directement sur mon raspberry, enregistrer en continu le flux vidéo sur ma clé USB (insérée sur un port du raspberry).

    Je sais que motion fonctionne sur la détection de mouvement, mais y a t-il une possibilité afin qu’il filme tout le temps ? sans prendre en compte la détection de mouvement ?

    Merci par avance.
    Toad.

    1. Salut Toad,

      Je pense que ça devrait être possible, ou au pire, il faudrait mettre la sensibilité de Motion au minimum (1 pixel) [voir param treshold] pour qu’il détecte constamment un mouvement, mais dans ton cas je ne vois pas l’utilité de passer par Motion du coup.

      Tu peux simplement lancer une commande qui récupérerait le flux vidéo de ta caméra et l’enregistrerait dans un fichier. Avec ffmpeg, ça ressemblerait à :
      ffmpeg -f oss -i /dev/dsp -f video4linux2 -s 320x240 -i /dev/video0 out.mpg

      Par contre attention à la taille de tes fichiers car 48h de vidéos ça peut faire beaucoup (suivant la résolution que tu utilises). Tu peux aussi scinder tes vidéos en plus petites tailles (par exemple 1h), pour qu’elles soient plus gérables et que tu ne perde pas la vidéo de toute ta journée si jamais tu as une coupure. 🙂

      Bon courage !

Laisser un commentaire

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