ESP32 S3 Kamera - Live-Video an Python auf dem PC senden
Der ESP32 S3 ist ein kleines Board. Er kann sehr gut Bilder aufnehmen, aber er kann kein Gesicht erkennen, kein Autokennzeichen lesen und keine Katze im Bild finden. Ihr Computer kann all das problemlos.
Deshalb lassen wir jede Seite das tun, was sie gut kann: Der ESP32 S3 sendet das Live-Video über WLAN, und ein Python-Programm auf Ihrem Computer empfängt es. Sobald das Bild in Python ist, können Sie alles damit machen.
Das Python-Programm hat nur etwa 20 Zeilen.

Was Sie bauen werden:
- Eine ESP32 S3 Kamera, die Live-Video über WLAN sendet
- Ein kurzes Python-Programm, das das Video in einem Fenster auf Ihrem Computer anzeigt
- Eine Taste, um jederzeit ein Bild als Datei zu speichern
- Ein zweites Python-Programm, das Gesichter im Video findet, um Ihnen zu zeigen, wie es weitergeht
Erforderliche Hardware
Oder Sie können die folgenden Kits kaufen:
| 1 | × | DIYables Sensor-Kit (18 Sensoren/Displays) |
※ Notiz:
Das ESP32 S3 Kamera-Board hat 40 Pins, aber der Schraubklemmenblock und das Breakout-Board haben 44 Pins. Sie funktionieren trotzdem zusammen. Setzen Sie das Kamera-Board in die Mitte des 44-Pin-Boards, sodass auf der linken Seite 2 Pins frei bleiben und auf der rechten Seite 2 Pins frei bleiben.
Mit dem Schraubklemmenblock können Sie Drähte mit einem Schraubendreher anschließen, ganz ohne Löten. Das Breakout-Board bietet Ihnen einfache Stiftleisten für ein Breadboard.
Sie brauchen außerdem einen Computer mit Python. Windows, Mac und Linux funktionieren alle.
Wie es funktioniert
Der ESP32 S3 sendet das Video auf dieselbe Weise wie eine Webkamera, als MJPEG-Stream. Das sind einfach viele JPEG-Bilder, eins nach dem anderen.
Die gute Nachricht: Python versteht das bereits. Die Bibliothek OpenCV öffnet das Video mit einer Zeile, genau so, wie sie eine Videodatei oder eine USB-Webcam öffnet:
Hier ist der ganze Weg, den ein Bild zurücklegt:
| Schritt | Wo | Was passiert |
|---|---|---|
| 1 | Kamera | Nimmt ein Bild auf und packt es als JPEG |
| 2 | ESP32 S3 | Sendet das JPEG über WLAN |
| 3 | Ihr Router | Leitet es an Ihren Computer weiter |
| 4 | Python | Liest es und macht daraus ein Bild, mit dem Sie arbeiten können |
| 5 | Ihr Code | Zeigt es an, speichert es oder sucht etwas darin |

Das Board hat außerdem zwei weitere Adressen, die während des Aufbaus nützlich sind:
| Adresse | Was sie Ihnen liefert |
|---|---|
| http://<IP>/ | Eine Webseite, um die Kamera zuerst in einem Browser zu testen |
| http://<IP>/stream | Das Live-Video. Diese Adresse öffnet Python. |
| http://<IP>/photo | Ein einzelnes JPEG-Bild, falls Ihr Programm nur eines braucht |
※ Notiz:
Testen Sie http://<IP>/ immer zuerst in Ihrem Webbrowser, bevor Sie Python starten. Wenn der Browser das Video zeigt, ist das Board in Ordnung, und jedes Problem danach liegt im Python-Teil. Diese eine Gewohnheit spart viel Zeit.
Verdrahtungsdiagramm
In diesem Projekt gibt es keine Verdrahtung. Der ESP32 S3 braucht nur Strom und WLAN.

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
※ Notiz:
Ihr Computer und Ihr ESP32 S3 müssen im selben WLAN-Netzwerk sein. Wenn sie in verschiedenen Netzwerken sind, kann Python das Board nicht erreichen.
Arduino IDE Einstellungen für die ESP32 S3 Kamera
Die Kamera funktioniert nicht mit den Standardeinstellungen der Arduino IDE. Sie müssen einige Punkte im Menü Tools ändern, bevor Sie den Code hochladen.
| Menüpunkt in Tools | Diese Auswahl treffen |
|---|---|
| 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 |
DIYables ESP32 WebServer Bibliothek installieren
- Öffnen Sie die Arduino IDE.
- Klicken Sie auf das Symbol Libraries in der linken Leiste.
- Geben Sie DIYables ESP32 WebServer in das Suchfeld ein.
- Suchen Sie die Bibliothek von DIYables.io und klicken Sie auf INSTALL.
- Search for DIYables ESP32 WebServer created by DIYables.io and click the Install button.
ESP32 S3 Code
Ändern Sie oben WIFI_SSID und WIFI_PASSWORD. Sonst muss nichts geändert werden.
Schnelle Schritte
- Neu beim ESP32 S3? Arbeiten Sie zuerst unsere Anleitung Erste Schritte mit dem ESP32 S3 durch.
- Installieren Sie die Bibliothek DIYables ESP32 WebServer.
- Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
- Ändern Sie WIFI_SSID und WIFI_PASSWORD auf Ihr eigenes WLAN.
- Ändern Sie die Einstellungen im Menü Tools. Siehe die Tabelle oben.
- Kompilieren Sie den Code und laden Sie ihn auf das ESP32 S3 Board hoch, indem Sie in der Arduino IDE auf die Schaltfläche Upload klicken.

- Öffnen Sie den Seriellen Monitor in der Arduino IDE.

- Drücken Sie einmal die Taste RESET.
- Notieren Sie sich die Adresse, die der Serielle Monitor ausgibt. Sie brauchen sie im Python-Code.
- Öffnen Sie diese Adresse in Ihrem Webbrowser und prüfen Sie, ob Sie das Video sehen.
Serieller Monitor
※ Notiz:
Die Zeile A program opened the video stream erscheint, wenn Ihr Python-Code startet. Wenn Sie sie nie sehen, erreicht Python das Board nicht, und das Problem liegt bei der Adresse oder dem Netzwerk.
Python und OpenCV installieren
- Installieren Sie Python von python.org. Unter Windows setzen Sie während der Installation das Häkchen bei Add python.exe to PATH.
- Öffnen Sie ein Terminal und installieren Sie OpenCV mit einem Befehl:
- Prüfen Sie, ob es funktioniert hat:
Sie sollten eine Versionsnummer sehen, zum Beispiel 4.12.0.
※ Notiz:
OpenCV ist die weltweit meistgenutzte Bibliothek für die Arbeit mit Bildern. Sie ist kostenlos und weiß bereits, wie man einen MJPEG-Stream liest, sodass Sie selbst nichts über JPEG oder WLAN schreiben müssen.
Python-Code - Beispiel 1: Das Video anzeigen
Das ist das ganze Programm. Es öffnet das Video, zeigt es in einem Fenster an und speichert ein Bild, wenn Sie die Taste s drücken.
Ändern Sie eine Zeile auf die Adresse aus Ihrem Seriellen Monitor:
Schnelle Schritte
- Speichern Sie den Code als camera_pc_view.py auf Ihrem Computer.
- Ändern Sie CAMERA_URL auf die Adresse Ihres Boards.
- Öffnen Sie ein Terminal im selben Ordner und führen Sie ihn aus:
- Ein Fenster öffnet sich und zeigt das Live-Video.
- Drücken Sie s, um ein Bild zu speichern. Drücken Sie ESC, um zu beenden.

Die wichtige Zeile
Alles Interessante passiert hier:
frame ist jetzt das Bild, als Tabelle von Zahlen. Das ist dieselbe Art von Bild, die jedes OpenCV-Beispiel im Internet verwendet. Ab dieser Zeile machen Sie also kein ESP32-Projekt mehr. Sie machen ein normales Computer-Vision-Projekt, und jedes Tutorial, jedes Beispiel und jede KI-Bibliothek funktioniert damit.
Python-Code - Beispiel 2: Gesichter finden
Um zu zeigen, was "jetzt können Sie alles machen" bedeutet, hier ist dasselbe Programm mit Gesichtserkennung. Es braucht keinen zusätzlichen Download, weil OpenCV einen Gesichtsfinder mitbringt.
Es wurden nur drei Dinge hinzugefügt:
Führen Sie es auf dieselbe Weise aus:

※ Notiz:
Dieser Gesichtsfinder ist alt und einfach, aber er ist schnell und braucht nichts zusätzlich. Er findet nur Gesichter, die direkt in die Kamera schauen. Für bessere Ergebnisse sehen Sie sich die Liste unten an.
Was können Sie in Python sonst noch tun?
Sobald das Bild in frame ist, ist der ESP32 S3 Teil Ihres Projekts fertig. Das fügen die Leute normalerweise als Nächstes hinzu:
| Was Sie möchten | Was Sie verwenden | Wie schwer |
|---|---|---|
| Gesichter finden | OpenCV, bereits installiert | Einfach |
| Personen, Autos, Tiere und 80 andere Dinge finden | YOLO (pip install ultralytics) | Einfach |
| Erkennen, wer eine Person ist | Bibliothek face_recognition | Mittel |
| Text und Zahlen im Bild lesen | Tesseract OCR (pip install pytesseract) | Mittel |
| Einen QR-Code oder Barcode lesen | OpenCV, bereits installiert | Einfach |
| Hände, Körper und Gesichter verfolgen | MediaPipe (pip install mediapipe) | Einfach |
| Eine KI fragen, was sie sieht | Ein KI-Dienst mit einer Bild-API | Mittel |
| Das Video in einer Datei aufzeichnen | OpenCV VideoWriter | Einfach |
| Eine Warnung an Telegram oder per E-Mail senden | Python requests oder smtplib | Einfach |
Zum Beispiel sind es etwa fünf Zeilen, um mit YOLO Personen zu finden:
※ Notiz:
Ihr Computer erledigt die schwere Arbeit, nicht der ESP32 S3. Deshalb ist dieser Weg so stark: Ein kleines, günstiges Board wird zum Auge, und Ihr Computer wird zum Gehirn. Das Board weiß nicht einmal, dass jemand nach Gesichtern sucht.
Fehlerbehebung
Python meldet Cannot open the camera.
- Öffnen Sie zuerst http://<IP>/ in Ihrem Webbrowser. Kein Video dort bedeutet, dass das Problem beim Board liegt, nicht bei Python.
- Ihr Computer und das Board müssen im selben WLAN-Netzwerk sein.
- Prüfen Sie, ob die Adresse in CAMERA_URL mit /stream endet.
- Verwenden Sie http://, nicht https://.
Das Fenster öffnet sich, bleibt aber grau oder schwarz.
Warten Sie ein paar Sekunden. Das erste Bild kann einen Moment dauern. Wenn es schwarz bleibt, ist der Raum möglicherweise zu dunkel.
Python meldet ModuleNotFoundError: No module named 'cv2'.
OpenCV ist nicht installiert. Führen Sie pip install opencv-python erneut aus und stellen Sie sicher, dass Sie dasselbe Python verwenden, das Ihre Datei ausführt.
Das Video in Python hinkt dem Video im Browser hinterher.
OpenCV hält einige Bilder in einer Warteschlange. Stellen Sie sicher, dass Ihre Schleife kein time.sleep() enthält, und halten Sie Ihre eigene Arbeit kurz. Ein kleineres Bild hilft auch: Ändern Sie FRAME_SIZE im ESP32 S3 Code auf FRAMESIZE_QVGA.
Das Video ist langsam, nur wenige Bilder pro Sekunde.
- Ändern Sie FRAME_SIZE im ESP32 S3 Code auf FRAMESIZE_QVGA (320 x 240).
- Ändern Sie JPEG_QUALITY von 12 auf 16, damit die Bilder kleiner werden.
- Bringen Sie das Board näher an den Router.
Das Video stoppt nach einigen Minuten.
Nur ein Programm kann das Video gleichzeitig lesen. Schließen Sie den Browser-Tab, der das Video anzeigt, und starten Sie Python dann erneut.
Der Serielle Monitor zeigt nie A program opened the video stream.
Python erreicht das Board nicht. Das ist ein Netzwerkproblem, kein Codeproblem. Prüfen Sie die Adresse und das WLAN.
Der Serielle Monitor zeigt nach den Startmeldungen nichts an.
Wenn Ihr USB-Kabel im Anschluss mit dem Namen UART steckt, stellen Sie USB CDC On Boot auf Disabled. Wenn es im Anschluss mit dem Namen USB steckt, stellen Sie es auf Enabled.
Anwendungen
Ein günstiges Board als Auge und ein Computer als Gehirn. Hier sind praktische Projekte, die Sie mit diesem Code bauen können:
- Türkamera mit Gesichtserkennung: Ihr Computer sieht ein Gesicht und öffnet die Tür oder schreibt die Uhrzeit in eine Datei.
- Personenzähler für einen Laden: Zählen Sie, wie viele Menschen im Laufe des Tages vorbeigehen.
- Kennzeichenleser: Lesen Sie das Kennzeichen mit OCR und öffnen Sie ein Tor für bekannte Autos.
- Paketdetektor: Lassen Sie YOLO erkennen, wenn ein Paket vor Ihrer Tür abgelegt wird, und senden Sie dann eine Nachricht an Ihr Handy.
- Haustierbeobachter: Erfahren Sie, wann Ihre Katze oder Ihr Hund in den Raum kommt, und zeichnen Sie nur diese Momente auf.
- Beobachter für Maschinen und 3D-Drucker: Stoppen Sie einen Druck, wenn das Bild zeigt, dass etwas schiefgelaufen ist.
- Qualitätsprüfung an einer Werkbank: Betrachten Sie jedes Teil, das an der Kamera vorbeikommt, und markieren Sie die fehlerhaften.
- Vogelhauskamera: Finden Sie mit einem Tiererkennungsmodell heraus, welche Vögel kommen.
- Fernbedienung per Handgeste: Winken Sie mit der Hand und lassen Sie den Computer eine Lampe einschalten.
- Computer Vision lernen: Ein sehr günstiger Weg, eine echte Live-Kamera in Ihren Python-Unterricht zu bringen.
Video Tutorial
Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.
Sehen Sie sich unten die Schritt-für-Schritt-Videoanleitung für dieses ESP32 S3 Projekt an.
Herausforderungen
- Einsteiger: Machen Sie das Bild in Python mit cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) schwarz-weiß, bevor Sie es anzeigen.
- Fortgeschrittene: Speichern Sie jedes Mal automatisch ein Bild, wenn ein Gesicht gefunden wird, mit der Uhrzeit im Dateinamen.
- Profis: Senden Sie einen Befehl zurück an den ESP32 S3, wenn Python etwas sieht. Fügen Sie dem Board eine Adresse wie /led_on hinzu und rufen Sie sie aus Python mit requests.get() auf. Im Tutorial ESP32 S3 - Telegram Bot erfahren Sie, wie Sie eigene Adressen hinzufügen.
Fortgeschrittenes Wissen - Warum HTTP hier gut genug ist
Viele Leute sehen sich dieses Projekt an und stellen eine berechtigte Frage: Python verwendet HTTP. Fragt es das Board nicht immer wieder nach einem neuen Bild? Das muss doch langsam sein.
Die Antwort ist nein, und es lohnt sich zu verstehen, warum.
Es gibt nur eine Anfrage
Python fragt ein einziges Mal, und die Verbindung bleibt dann für immer offen. Das Board schreibt neue Bilder in dieselbe offene Verbindung, bis Sie das Programm beenden.
Das funktioniert dank einer besonderen Antwort des Boards:
multipart/x-mixed-replace sagt der anderen Seite: *"Auf dieser Verbindung kommen weitere Bilder, und jedes neue ersetzt das vorherige"*. Das Board schreibt also einfach Bild für Bild:
Sie können das selbst im Seriellen Monitor sehen. Die Zeile A program opened the video stream erscheint ein einziges Mal, wenn Python startet, nicht zehnmal pro Sekunde. Würde HTTP wirklich für jedes Bild neu fragen, würde diese Zeile über Ihren Bildschirm laufen.
Wie viel wird verschwendet?
Zwischen zwei Bildern sendet das Board nur ein Trennzeichen und zwei kurze Zeilen:
Ein Bild mit 640 × 480 ist etwa 30000 Bytes groß. Der zusätzliche Text macht also etwa 0,2 % dessen aus, was gesendet wird. Zwei Bytes von tausend. Durch das Entfernen gibt es nichts zu gewinnen.
※ Notiz:
Eine andere Art des Sendens, ganz ohne HTTP, würde diese 70 Bytes pro Bild sparen. Bei einem Stream mit 10 Bildern pro Sekunde sind das 700 Bytes pro Sekunde, von etwa 300000. Sie würden den Unterschied nie bemerken.
Was wirklich etwas kostet
Die Verschwendung liegt nicht bei HTTP. Sie liegt an zwei anderen Stellen:
| Echte Kosten | Warum | Können Sie es beheben? |
|---|---|---|
| Jedes Bild ist ein vollständiges JPEG | Der ESP32 S3 hat keinen Video-Encoder, daher kann er nicht nur "das, was sich geändert hat" senden, wie es ein Film tut | Nein. Das liegt an der Hardware. |
| Ihr Computer hält alte Bilder in einer Warteschlange | OpenCV hält einige Bilder vor, sodass das, was Sie sehen, einen Moment hinterherhinken kann | Ja, siehe unten |
| Nur ein Programm kann zusehen | Der kleine Webserver antwortet jeweils nur einem Programm | Ja, mit einem größeren Server |
Das zweite ist das einzige Problem, das die Leute wirklich bemerken. Die Lösung liegt auf der Python-Seite, nicht auf dem Board: Lesen Sie die Bilder im Hintergrund und nehmen Sie immer das neueste.
※ Notiz:
Ihr eigener Code liest dann camera.frame, wann immer er bereit ist. Alte Bilder werden verworfen, statt in einer Warteschlange zu warten, sodass sich das Video wieder live anfühlt. Das hilft sehr, wenn Ihr Programm langsame Arbeit erledigt, zum Beispiel Objekterkennung.
Warum HTTP hier eine gute Wahl ist
Abgesehen davon, dass es schnell genug ist, bietet Ihnen HTTP Dinge, die eine eigene Übertragungsart nie bieten würde:
| Vorteil | Warum es wichtig ist |
|---|---|
| Ihr Webbrowser kann es öffnen | Sie können die Kamera testen, bevor Sie eine Zeile Python schreiben |
| VLC kann es öffnen | Ein kostenloser Videoplayer zeigt den Stream ganz ohne Code |
| OpenCV öffnet es mit einer Zeile | cv2.VideoCapture(url) und Sie sind fertig |
| Home Assistant und andere Programme kennen es | Ihre Kamera passt ohne zusätzliche Arbeit in ein Smart Home |
| Es läuft durch Ihren Router | Keine Portweiterleitung, keine speziellen Einstellungen |
| Es ist leicht zu untersuchen, wenn es nicht funktioniert | Jedes Problem ist in einem Browser sichtbar |
※ Notiz:
Das ist der eigentliche Grund, HTTP zu wählen. Nicht die Geschwindigkeit, sondern dass alles es bereits spricht. Ein schnellerer Weg, den nur Ihr eigenes Programm versteht, ist meist ein schlechter Tausch.
Wann sollten Sie etwas anderes verwenden?
Es gibt echte Gründe für einen Wechsel, aber sie haben nichts mit den 70 Bytes zu tun:
| Übertragungsart | Wählen Sie sie, wenn | Kosten |
|---|---|---|
| MJPEG über HTTP (dieses Tutorial) | Fast immer | Keine |
| Rohes TCP, eigenes Format | Der PC ist das Gehirn und Sie möchten volle Kontrolle | Sie schreiben beide Seiten selbst |
| UDP | Sie brauchen die geringstmögliche Verzögerung, und ein kaputtes Bild ist besser als ein verspätetes | Bilder kommen beschädigt oder gar nicht an |
| RTSP | Sie möchten die Kamera in ein Sicherheitssystem oder einen NVR einbinden | Eine Bibliothek und mehr Code |
| WebSocket | Eine Webseite muss das Video anzeigen und Befehle zurücksenden | Mehr Code auf beiden Seiten |
※ Notiz:
Für ein Projekt, bei dem ein Computer die Bilder auswertet, ist MJPEG über HTTP die richtige Antwort. Ändern Sie es nur, wenn Sie ein echtes Problem gemessen haben, nicht weil HTTP langsam klingt.