Skip to content

Description de l'implémentation de la surveillance interne

Ce script récupère le flux vidéo de la caméra et le publie via une application web.

Route pour le flux vidéo

La route /video_feed est définie pour fournir un flux vidéo en continu. Voici le code correspondant :

# Définition de la route pour le flux vidéo
@app.route('/video_feed')
def video_feed():
    # Fonction génératrice qui produit un flux vidéo
    def generate_video_stream():
        # Initialisation de l'instance Picamera2
        picam2 = Picamera2()
        # Configuration de la caméra pour une résolution de 640x480
        config = picam2.create_still_configuration(main={"size": (640, 480)})
        picam2.configure(config)
        # Démarrage de la caméra
        picam2.start()
        # Création d'un flux en mémoire pour stocker les images
        stream = io.BytesIO()

        try:
            while True:
                # Capture d'une image et stockage dans le flux
                picam2.capture_file(stream, format="jpeg")
                # Réinitialisation du curseur du flux au début
                stream.seek(0)
                # Lecture de l'image du flux
                frame = stream.read()
                # Génération des données du flux en format multipart
                yield (b'--frame\r\n'
                       b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
                # Réinitialisation du flux pour la prochaine image
                stream.seek(0)
                stream.truncate()
        finally:
            # Arrêt et fermeture de la caméra lorsque terminé
            picam2.stop()
            picam2.close()

    # Retourne une réponse HTTP avec le flux vidéo généré
    return Response(generate_video_stream(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

Initialisation de la caméra

Le flux vidéo est capturé à partir de la caméra Raspberry Pi via la bibliothèque Picamera2 :

# Initialisation de l'instance Picamera2
picam2 = Picamera2()
# Configuration de la caméra pour une résolution de 640x480
config = picam2.create_still_configuration(main={"size": (640, 480)})
picam2.configure(config)
# Démarrage de la caméra
picam2.start()
  • Picamera2() : création d'une instance de la caméra.
  • create_still_configuration : configuration de la caméra pour capturer des images de 640x480 pixels.
  • configure : application de la configuration.
  • start : démarrage de la caméra.

Capture et envoi des images

Les images capturées sont envoyées en continu sous forme de flux vidéo multipart :

# Création d'un flux en mémoire pour stocker les images
stream = io.BytesIO()

try:
    while True:
        # Capture d'une image et stockage dans le flux
        picam2.capture_file(stream, format="jpeg")
        # Réinitialisation du curseur du flux au début
        stream.seek(0)
        # Lecture de l'image du flux
        frame = stream.read()
        # Génération des données du flux en format multipart
        yield (b'--frame\r\n'
                b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
        # Réinitialisation du flux pour la prochaine image
        stream.seek(0)
        stream.truncate()
finally:
    # Arrêt et fermeture de la caméra lorsque terminé
    picam2.stop()
    picam2.close()
  • io.BytesIO() : création d'un flux en mémoire pour stocker les images capturées.
  • capture_file : capture d'une image et stockage dans le flux.
  • stream.seek(0) : réinitialisation du curseur du flux au début.
  • stream.read() : lecture de l'image du flux.
  • yield : envoi de l'image sous forme de réponse multipart.
  • finally : arrêt et fermeture de la caméra.

Démarrage du serveur Flask

Le serveur Flask est configuré pour démarrer sur l'adresse IP 0.0.0.0 et le port 8000, avec le mode débogage activé :

# Point d'entrée de l'application
if __name__ == '__main__':
    # Démarrage du serveur Flask, accessible depuis n'importe quelle adresse IP sur le port 8000
    app.run(host='0.0.0.0', port=8000, debug=True)
  • if __name__ == '__main__': : vérifie si le script est exécuté directement.
  • app.run(host='0.0.0.0', port=8000, debug=True) : démarre le serveur Flask, accessible depuis n'importe quelle adresse IP sur le port 8000, avec le mode débogage activé.