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é.