Caméra ESP32 S3 - Envoyer la vidéo en direct vers Python sur PC
L'ESP32 S3 est une petite carte. Elle peut très bien prendre des photos, mais elle ne peut pas reconnaître un visage, lire une plaque d'immatriculation ou trouver un chat dans l'image. Votre ordinateur peut faire tout cela facilement.
Alors on laisse chaque côté faire ce qu'il fait le mieux : l'ESP32 S3 envoie la vidéo en direct via WiFi, et un programme Python sur votre ordinateur la reçoit. Une fois l'image dans Python, vous pouvez en faire ce que vous voulez.
Le programme Python fait environ 20 lignes.

Ce que vous allez construire :
- Une caméra ESP32 S3 qui envoie la vidéo en direct via WiFi
- Un court programme Python qui affiche la vidéo dans une fenêtre sur votre ordinateur
- Une touche pour enregistrer une image sous forme de fichier, quand vous le souhaitez
- Un second programme Python qui trouve les visages dans la vidéo, pour vous montrer comment aller plus loin
Matériel nécessaire
Ou vous pouvez acheter les kits suivants:
| 1 | × | Kit de Capteurs DIYables (18 capteurs/écrans) |
※ Note:
La carte caméra ESP32 S3 a 40 broches, mais le bornier à vis et la carte d'extension ont 44 broches. Elles fonctionnent quand même ensemble. Placez la carte caméra au centre de la carte à 44 broches, de sorte que 2 broches restent libres du côté gauche et 2 broches restent libres du côté droit.
Le bornier à vis vous permet de connecter des fils avec un tournevis, sans soudure. La carte d'extension vous donne des broches faciles à utiliser pour une breadboard.
Vous avez aussi besoin d'un ordinateur avec Python. Windows, Mac et Linux fonctionnent tous.
Comment ça fonctionne
L'ESP32 S3 envoie la vidéo de la même manière qu'une webcam, sous forme de flux MJPEG. C'est simplement une succession de nombreuses images JPEG.
La bonne nouvelle : Python comprend déjà ce format. La bibliothèque OpenCV ouvre la vidéo en une seule ligne, exactement comme elle ouvrirait un fichier vidéo ou une webcam USB :
Voici tout le trajet que parcourt une image :
| Étape | Où | Ce qui se passe |
|---|---|---|
| 1 | Caméra | Prend une photo et l'encode en JPEG |
| 2 | ESP32 S3 | Envoie le JPEG via WiFi |
| 3 | Votre routeur | La transporte vers votre ordinateur |
| 4 | Python | La lit et la transforme en une image que vous pouvez utiliser |
| 5 | Votre code | L'affiche, l'enregistre, ou cherche quelque chose dedans |

La carte possède aussi deux autres adresses, utiles pendant le développement :
| Adresse | Ce qu'elle vous donne |
|---|---|
| http://<IP>/ | Une page web, pour tester la caméra d'abord dans un navigateur |
| http://<IP>/stream | La vidéo en direct. C'est celle que Python ouvre. |
| http://<IP>/photo | Une seule image JPEG, si votre programme n'a besoin que d'une image |
※ Note:
Testez toujours http://<IP>/ dans votre navigateur web avant de lancer Python. Si le navigateur affiche la vidéo, la carte fonctionne correctement, et tout problème après cela vient de la partie Python. Cette simple habitude fait gagner beaucoup de temps.
Schéma de câblage
Il n'y a pas de câblage dans ce projet. L'ESP32 S3 a seulement besoin d'alimentation et de WiFi.

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
※ Note:
Votre ordinateur et votre ESP32 S3 doivent être sur le même réseau WiFi. S'ils sont sur des réseaux différents, Python ne peut pas atteindre la carte.
Paramètres de l'Arduino IDE pour la caméra ESP32 S3
La caméra ne fonctionne pas avec les paramètres par défaut de l'Arduino IDE. Vous devez modifier certains éléments dans le menu Tools avant de téléverser le code.
| Élément du menu Tools | Sélectionnez ceci |
|---|---|
| Board | ESP32S3 Dev Module |
| Flash Size | 16MB (128Mb) |
| PSRAM | OPI PSRAM |
| Partition Scheme | Huge APP (3MB No OTA/1MB SPIFFS) |
| CPU Frequency | 240MHz (WiFi) |
| USB Mode | Hardware CDC and JTAG |
| Upload Mode | UART0 / Hardware CDC |
| Upload Speed | 921600 |
| USB CDC On Boot | Enabled |
Installer la bibliothèque DIYables ESP32 WebServer
- Ouvrez l'Arduino IDE.
- Cliquez sur l'icône Libraries dans la barre de gauche.
- Tapez DIYables ESP32 WebServer dans le champ de recherche.
- Trouvez la bibliothèque de DIYables.io et cliquez sur INSTALL.
- Search for DIYables ESP32 WebServer created by DIYables.io and click the Install button.
Code ESP32 S3
Modifiez WIFI_SSID et WIFI_PASSWORD en haut. Rien d'autre n'a besoin d'être changé.
Étapes rapides
- Nouveau sur l'ESP32 S3 ? Suivez d'abord notre guide ESP32 S3 - Premiers pas.
- Installez la bibliothèque DIYables ESP32 WebServer.
- Copiez le code ci-dessus et collez-le dans l'Arduino IDE.
- Changez WIFI_SSID et WIFI_PASSWORD pour votre propre WiFi.
- Changez les paramètres dans le menu Tools. Voir le tableau ci-dessus.
- Compilez et téléversez le code sur la carte ESP32 S3 en cliquant sur le bouton Upload dans l'Arduino IDE.

- Ouvrez le Serial Monitor dans l'Arduino IDE.

- Appuyez une fois sur le bouton RESET.
- Notez l'adresse que le Serial Monitor affiche. Vous en aurez besoin dans le code Python.
- Ouvrez cette adresse dans votre navigateur web et vérifiez que vous voyez la vidéo.
Serial Monitor
※ Note:
La ligne A program opened the video stream apparaît lorsque votre code Python démarre. Si vous ne la voyez jamais, Python n'atteint pas la carte, et le problème vient de l'adresse ou du réseau.
Installer Python et OpenCV
- Installez Python depuis python.org. Sous Windows, cochez la case Add python.exe to PATH pendant l'installation.
- Ouvrez un terminal, et installez OpenCV avec une seule commande :
- Vérifiez que cela a fonctionné :
Vous devriez voir un numéro de version, par exemple 4.12.0.
※ Note:
OpenCV est la bibliothèque la plus utilisée au monde pour travailler avec des images. Elle est gratuite, et elle sait déjà lire un flux MJPEG, donc vous n'avez rien à écrire vous-même concernant le JPEG ou le WiFi.
Code Python - Exemple 1 : Afficher la vidéo
Voici le programme complet. Il ouvre la vidéo, l'affiche dans une fenêtre, et enregistre une image lorsque vous appuyez sur la touche s.
Changez une ligne pour indiquer l'adresse de votre Serial Monitor :
Étapes rapides
- Enregistrez le code sous le nom camera_pc_view.py sur votre ordinateur.
- Changez CAMERA_URL pour l'adresse de votre carte.
- Ouvrez un terminal dans le même dossier et exécutez-le :
- Une fenêtre s'ouvre et affiche la vidéo en direct.
- Appuyez sur s pour enregistrer une image. Appuyez sur ESC pour arrêter.

La ligne importante
Tout ce qui est intéressant se passe ici :
frame est maintenant l'image, sous forme d'un tableau de nombres. C'est le même type d'image que celui utilisé par tous les exemples OpenCV sur internet. Donc à partir de cette ligne, vous ne faites plus un projet ESP32. Vous faites un projet de vision par ordinateur classique, et tous les tutoriels, tous les exemples et toutes les bibliothèques d'IA fonctionnent avec.
Code Python - Exemple 2 : Trouver des visages
Pour montrer ce que signifie « vous pouvez maintenant tout faire », voici le même programme avec la détection de visages. Il ne nécessite aucun téléchargement supplémentaire, car OpenCV inclut déjà un détecteur de visages.
Seulement trois choses ont été ajoutées :
Exécutez-le de la même manière :

※ Note:
Ce détecteur de visages est ancien et simple, mais il est rapide et ne nécessite rien de plus. Il ne trouve que les visages qui regardent directement la caméra. Pour de meilleurs résultats, voir la liste ci-dessous.
Que pouvez-vous faire d'autre en Python ?
Une fois que l'image est dans frame, la partie ESP32 S3 de votre projet est terminée. Voici ce que les gens ajoutent habituellement ensuite :
| Ce que vous voulez | Ce qu'il faut utiliser | Niveau de difficulté |
|---|---|---|
| Trouver des visages | OpenCV, déjà installé | Facile |
| Trouver des personnes, voitures, animaux, 80 autres choses | YOLO (pip install ultralytics) | Facile |
| Reconnaître qui est une personne | bibliothèque face_recognition | Moyen |
| Lire du texte et des chiffres dans l'image | Tesseract OCR (pip install pytesseract) | Moyen |
| Lire un QR code ou un code-barres | OpenCV, déjà installé | Facile |
| Suivre les mains, les corps et les visages | MediaPipe (pip install mediapipe) | Facile |
| Demander à une IA ce qu'elle voit | Un service d'IA avec une API image | Moyen |
| Enregistrer la vidéo dans un fichier | VideoWriter d'OpenCV | Facile |
| Envoyer une alerte sur Telegram ou par email | requests ou smtplib en Python | Facile |
Par exemple, trouver des personnes avec YOLO tient en environ cinq lignes :
※ Note:
C'est votre ordinateur qui fait le travail difficile, pas l'ESP32 S3. C'est pourquoi cette approche est si efficace : une petite carte bon marché devient l'œil, et votre ordinateur devient le cerveau. La carte ne sait même pas que quelqu'un cherche des visages.
Dépannage
Python affiche Cannot open the camera.
- Ouvrez d'abord http://<IP>/ dans votre navigateur web. Aucune vidéo là-bas signifie que le problème vient de la carte, pas de Python.
- Votre ordinateur et la carte doivent être sur le même réseau WiFi.
- Vérifiez que l'adresse dans CAMERA_URL se termine par /stream.
- Utilisez http://, pas https://.
La fenêtre s'ouvre mais reste grise ou noire.
Attendez quelques secondes. La première image peut prendre un moment. Si elle reste noire, la pièce est peut-être trop sombre.
Python affiche ModuleNotFoundError: No module named 'cv2'.
OpenCV n'est pas installé. Exécutez à nouveau pip install opencv-python, et assurez-vous d'utiliser le même Python que celui qui exécute votre fichier.
La vidéo dans Python est en retard sur celle du navigateur.
OpenCV garde quelques images dans une file d'attente. Assurez-vous que votre boucle n'a pas de time.sleep(), et gardez votre propre traitement court. Une image plus petite aide aussi : changez FRAME_SIZE en FRAMESIZE_QVGA dans le code ESP32 S3.
La vidéo est lente, seulement quelques images par seconde.
- Changez FRAME_SIZE en FRAMESIZE_QVGA (320 x 240) dans le code ESP32 S3.
- Changez JPEG_QUALITY de 12 à 16, afin que les images soient plus petites.
- Rapprochez la carte du routeur.
La vidéo s'arrête après quelques minutes.
Un seul programme peut lire la vidéo à la fois. Fermez l'onglet du navigateur qui affiche la vidéo, puis relancez Python.
Le Serial Monitor n'affiche jamais A program opened the video stream.
Python n'atteint pas la carte. C'est un problème de réseau, pas de code. Vérifiez l'adresse et le WiFi.
Le Serial Monitor n'affiche rien après les messages de démarrage.
Si votre câble USB est branché sur le port nommé UART, réglez USB CDC On Boot sur Disabled. S'il est branché sur le port nommé USB, réglez-le sur Enabled.
Applications
Une carte bon marché comme œil, et un ordinateur comme cerveau. Voici des projets pratiques que vous pouvez construire avec ce code :
- Caméra de porte avec détection de visage : votre ordinateur voit un visage et ouvre la porte, ou écrit l'heure dans un fichier.
- Compteur de personnes pour un magasin : comptez combien de personnes passent au cours de la journée.
- Lecteur de plaque d'immatriculation : lisez la plaque avec l'OCR et ouvrez un portail pour les voitures connues.
- Détecteur de colis : laissez YOLO voir quand un colis est déposé à votre porte, puis envoyez un message sur votre téléphone.
- Surveillance d'animaux domestiques : sachez quand votre chat ou votre chien entre dans la pièce, et n'enregistrez que ces moments.
- Surveillance de machine et d'imprimante 3D : arrêtez une impression quand l'image montre qu'un problème est survenu.
- Contrôle qualité sur un établi : regardez chaque pièce qui passe devant la caméra et marquez celles qui sont défectueuses.
- Caméra de mangeoire à oiseaux : découvrez quels oiseaux viennent, avec un modèle de reconnaissance animale.
- Télécommande par geste de la main : faites un signe de la main et laissez l'ordinateur allumer une lampe.
- Apprentissage de la vision par ordinateur : un moyen très bon marché d'intégrer une vraie caméra en direct dans vos cours de Python.
Vidéo
Regardez le tutoriel vidéo étape par étape pour ce projet ESP32 S3 ci-dessous.
Défis
- Débutant : rendez l'image noir et blanc en Python avec cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) avant de l'afficher.
- Intermédiaire : enregistrez une image à part chaque fois qu'un visage est trouvé, avec l'heure dans le nom du fichier.
- Avancé : envoyez une commande en retour vers l'ESP32 S3 lorsque Python voit quelque chose. Ajoutez une adresse comme /led_on à la carte, et appelez-la depuis Python avec requests.get(). Consultez le tutoriel ESP32 S3 - Bot Telegram pour savoir comment ajouter vos propres adresses.
Connaissances avancées - Pourquoi HTTP est suffisant ici
Beaucoup de gens regardent ce projet et posent une question légitime : Python utilise HTTP. Ne demande-t-il pas encore et encore une nouvelle image à la carte ? Cela doit être lent.
La réponse est non, et cela vaut la peine de comprendre pourquoi.
Il n'y a qu'une seule requête
Python demande une seule fois, et la connexion reste ensuite ouverte pour toujours. La carte continue d'écrire de nouvelles images dans cette même connexion ouverte jusqu'à ce que vous arrêtiez le programme.
Cela fonctionne grâce à une réponse spéciale de la carte :
multipart/x-mixed-replace indique à l'autre côté : *« d'autres images arrivent sur cette même connexion, et chaque nouvelle remplace la précédente »*. Ainsi, la carte écrit simplement image après image :
Vous pouvez le constater vous-même dans le Serial Monitor. La ligne A program opened the video stream apparaît une seule fois au démarrage de Python, pas dix fois par seconde. Si HTTP redemandait vraiment une image à chaque fois, cette ligne défilerait sans cesse sur votre écran.
Combien est gaspillé ?
Entre deux images, la carte envoie seulement un séparateur et deux courtes lignes :
Une image en 640 × 480 pèse environ 30000 octets. Le texte supplémentaire représente donc environ 0,2 % de ce qui est envoyé. Deux octets sur mille. Il n'y a rien à gagner à le supprimer.
※ Note:
Une autre méthode d'envoi, sans HTTP du tout, économiserait ces 70 octets par image. Sur un flux de 10 images par seconde, cela représente 700 octets par seconde, sur environ 300000. Vous ne verriez jamais la différence.
Qu'est-ce qui coûte vraiment quelque chose ?
Le gaspillage ne vient pas de HTTP. Il vient de deux autres endroits :
| Coût réel | Pourquoi | Pouvez-vous le corriger ? |
|---|---|---|
| Chaque image est un JPEG complet | L'ESP32 S3 n'a pas d'encodeur vidéo, donc il ne peut pas envoyer seulement « ce qui a changé » comme le fait un film | Non. C'est le matériel. |
| Votre ordinateur garde d'anciennes images dans une file d'attente | OpenCV conserve quelques images, donc ce que vous voyez peut être en léger retard | Oui, voir ci-dessous |
| Un seul programme peut regarder | Le petit serveur web ne répond qu'à un seul programme à la fois | Oui, avec un serveur plus gros |
Le deuxième point est le seul problème que les gens remarquent vraiment. La correction se fait du côté Python, pas sur la carte : lire les images en arrière-plan et toujours prendre la plus récente.
※ Note:
Votre propre code lit ensuite camera.frame dès qu'elle est prête. Les anciennes images sont jetées au lieu d'attendre dans une file, donc la vidéo redevient fluide et en direct. Cela aide beaucoup lorsque votre programme effectue un traitement lent, par exemple de la détection d'objets.
Pourquoi HTTP est un bon choix ici
En plus d'être assez rapide, HTTP vous offre des choses qu'une méthode d'envoi privée n'offrirait jamais :
| Bonne chose | Pourquoi c'est important |
|---|---|
| Votre navigateur web peut l'ouvrir | Vous pouvez tester la caméra avant d'écrire la moindre ligne de Python |
| VLC peut l'ouvrir | Un lecteur vidéo gratuit affiche le flux sans aucun code |
| OpenCV l'ouvre en une seule ligne | cv2.VideoCapture(url) et c'est fait |
| Home Assistant et d'autres programmes le connaissent | Votre caméra s'intègre dans une maison connectée sans travail supplémentaire |
| Il passe par votre routeur | Pas de redirection de port, pas de paramètres spéciaux |
| Il est facile à examiner en cas de panne | Tout problème est visible dans un navigateur |
※ Note:
C'est la vraie raison de choisir HTTP. Pas la vitesse, mais le fait que tout le monde le parle déjà. Une méthode plus rapide que seul votre programme comprend est généralement un mauvais compromis.
Quand devriez-vous utiliser autre chose ?
Il existe de vraies raisons de changer, mais elles ne concernent pas les 70 octets :
| Méthode d'envoi | Choisissez-la quand | Coût |
|---|---|---|
| MJPEG sur HTTP (ce tutoriel) | Presque toujours | Rien |
| TCP brut, votre propre format | Le PC est le cerveau et vous voulez un contrôle total | Vous écrivez les deux côtés vous-même |
| UDP | Vous avez besoin du délai le plus faible possible, et une image cassée vaut mieux qu'une image en retard | Les images arrivent cassées ou pas du tout |
| RTSP | Vous voulez intégrer la caméra dans un système de sécurité ou un NVR | Une bibliothèque et plus de code |
| WebSocket | Une page web doit afficher la vidéo et renvoyer des commandes | Plus de code des deux côtés |
※ Note:
Pour un projet où un ordinateur regarde les images, MJPEG sur HTTP est la bonne réponse. Changez seulement quand vous avez mesuré un vrai problème, pas parce que HTTP semble lent.