Accueil > Matériel, Raspberry > TimeLapse et détection de mouvement à l’aide d’un Raspberry Pi et d’une caméra

TimeLapse et détection de mouvement à l’aide d’un Raspberry Pi et d’une caméra

Dans un article précédent « Utilisation d’une caméra pour le Raspberry Pi« , nous avons vu comment activer la prise en compte d’une caméra pour le Raspberry. Dans cet article, nous allons mettre en oeuvre un serveur Web qui va permettre de piloter la caméra afin d’effectuer les actions suivantes :

  • Configuration des paramètres de prise de vue.
  • Streaming vidéo.
  • Timelapse.
  • Détection de mouvement avec prise de vue.

Le programme sera écrit en Python en utilisant 2 modules :

  • Picamera : module de gestion de la caméra.
  • Flask : module permettant la gestion d’un serveur Web.

Passons à l’implémentation de la solution (attention le tuto est un peu long).

La première étape est l’installation des modules Python; pour l’installation du module PiCamera pour Python 2.x et Python3:

sudo apt-get install python-picamera python3-picamera

Pour l’installation du module Flask :

sudo apt-get install python-flask python3-flask

Ensuite il faut créer un dossier, par exemple « Programmes » qui contiendra l’arborescence suivante :

  • cam_photo.py : le programme principal en Python.
  • templates : dossier qui contient les pages HTML.
  • photos : dossier créé au démarrage du programme Python.

Tout est téléchargeable sur mon github iTechnoFrance.

La première chose à effectuer dans le programme, est l’importation des différents modules nécessaires :

import os, time, io, threading, picamera, picamera.array
from flask import Flask, render_template, redirect, url_for, request, Response

Ensuite on déclare la partie Web :

# declaration site Web
site = Flask(__name__)

 

if __name__ == ‘__main__’:
initialisation()
site.run(host = ‘0.0.0.0’, debug = True, threaded = True, port = 80)

on accédera au serveur Web, en tapant l’adresse IP du Raspberry.

La Première page Web est déclaré ainsi :

@site.route(‘/’, methods = [‘POST’, ‘GET’])
def index():
return render_template(‘index.html’)

On déclare une route « / » qui va permettre avec la fonction index de charger la page index.html qui se trouve dans le dossier templates.

Le contenu du fichier index.html permettra d’afficher une page avec différents choix :

Le visuel est le suivant :

En cliquant sur « Paramètres » on obtient l’écran suivant :

Cette page HTML va permettre de configurer certains paramètres de prise de vue :

  • La sensibilité ISO qui sera prise en compte pour la visualisation en temps réel, le TimeLapse et la détection de mouvement. Attention pour le TimeLapse veiller à ne pas laisser la sensibilité sur « Automatique ».
  • La balance des blancs et le mode d’exposition qui seront pris en compte pour la visualisation en temps réel et la détection de mouvement. Pour le TimeLapse, afin d’avoir des photos constantes, on va fixer certains paramètres en manuel.
  • La résolution de la photo prise pour le TimeLapse et la détection de mouvement.

La partie du programme qui va permettre de traiter le choix « Paramètres » est le suivant :

# Permet de configurer quelques paramètres de prise de vue
@site.route(‘/parametres’, methods = [‘POST’, ‘GET’])
def parametres():
return render_template(‘parametres.html’)

@site.route(‘/sauve_parametres’, methods = [‘POST’])
def sauve_parametres():
global iso, wb, exposition, resolution_x, resolution_y
if request.method == ‘POST’:
if ‘save’ in request.form:
iso = int(request.form[‘iso’])
wb = request.form[‘wb’]
exposition = request.form[‘exposition’]
resolution_str = request.form[‘resolution’]
if resolution_str == « 0 »:
resolution_x = 640
resolution_y = 480
if resolution_str == « 1 »:
resolution_x = 800
resolution_y = 600
if resolution_str == « 2 »:
resolution_x = 1024
resolution_y = 768
if resolution_str == « 3 »:
resolution_x = 1920
resolution_y = 1080
if resolution_str == « 4 »:
resolution_x = 2592
resolution_y = 1944
return redirect(url_for(‘index’))

Le fichier HTML correspondant est le suivant :

En cliquant sur le bouton « Enregistrer« , on revient sur la page principale.

En cliquant, sur le bouton « Affichage« , on va streamer ce que voit la caméra;

cela va permettre de vérifier le positionnement de la caméra et donc le cadrage de prise de vue.

On transmet des photos et non pas de la vidéo pour économiser la bande passante :

Pour cette partie de programme, je me suis servi d’un article sur le site Code4Corsica.

La traitement de la partie Web est la suivante :

# Permet de streamer des photos
@site.route(‘/visualisation’, methods = [‘POST’, ‘GET’])
def visualisation():
return render_template(‘visualisation.html’)

# On définit une URL permettant la récupération d’images
@site.route(‘/image_url’)
def image_url():
# Route générant le flux d’images
# Doit être appelée depuis l’attribut « src » d’une balise « img »
return Response(generateur(MaCamera()), mimetype=’multipart/x-mixed-replace; boundary=frame’)

Le contenu du fichier HTML est le suivant :

En cliquant sur le bouton « Acceuil« , on revient sur la page principale.

Le bouton « TimeLapse » va permettre d’effectuer des prises de vue à intervalle régulier :

Cet écran va permettre de définir l’intervalle de prise de vue et également la possibilité de définir ou non une durée de prise de vue.

Le traitement de la partie Web sera la suivante :

# Permet de configurer et d’effectuer du TimeLapse
@site.route(‘/timelapse’, methods = [‘POST’, ‘GET’])
def timelapse():
global intervalle, duree, bouton_status_timelapse
if request.method == ‘POST’:
if ‘start’ in request.form:
intervalle = int(request.form[‘intervalle’])
duree = int(request.form[‘duree’])
bouton_status_timelapse = True
if not fct_start:
traite_timelapse()
if ‘stop’ in request.form:
bouton_status_timelapse = False
return render_template(‘timelapse.html’)

Le contenu du fichier HTML est le suivant :

L’option « Mouvement » de la page d’acceuil va permettre d’effectuer une détection de mouvement et une prise de vue :

Pour la détection du mouvement, vous allez pouvoir jouer sur le seuil de déclenchement correspondant au nombre de pixels modifiés entre 2 vues et sur la sensibilité qui va comptabiliser le nombre de fois que l’image a été modifié. A vous d’effectuer des tests pour trouver le bon compromis pour déclencher une prise de vue.

Le traitement de la partie Web est le suivant :

# Permet la prise de vue suite à un mouvement détecté
@site.route(‘/mouvement’, methods = [‘POST’, ‘GET’])
def mouvement():
global ctr_photo, bouton_status_motion, scan_motion, ctr_start
if request.method == ‘POST’:
if ‘start’ in request.form:
bouton_status_motion = True
if not fct_start:
detection_mouvement()
if ‘stop’ in request.form:
bouton_status_motion = False
return render_template(‘mouvement.html’)

@site.route(‘/mouvement_set_seuil’, methods = [‘POST’, ‘GET’])
def mouvement_set_seuil():
global seuil
seuil = int(request.args.get(« seuil »))
return str(seuil)

@site.route(‘/mouvement_set_sensibilite’, methods = [‘POST’, ‘GET’])
def mouvement_set_sensibilite():
global sensibilite
sensibilite = int(request.args.get(« sensibilite »))
return str(sensibilite)

Le contenu du fichier HTML est le suivant :

Il y a du Javascript pour le traitement des Sliders.

Ensuite la dernière option possible est l’arrêt du Raspberry dont le traitement du bouton est le suivant :

# Permet d’arrêter le Raspberry
@site.route(‘/halt’, methods = [‘POST’, ‘GET’])
def halt_pi():
os.system(‘sudo halt’)

Voilà pour la présentation des fonctionnalités.

Pour le bon fonctionnement du programme, il faut l’exécuter avec les droit root :

sudo python cam_photo.py

Reste à effectuer des tests en réel à l’extérieure; pour une portabilité maximale, il serait conseillé que le Raspberry Pi joue le rôle de point d’accès WiFi.

  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :