ESP-EYE: Videostream ins lokale Netz

Der ESP-EYE ist ein ESP32 mit 2 MP-Kamera und digitalem Mikrofon auf einer Platine.

Als kompaktes Gerät könne man ihn als Webserver im Netz laufen lassen, der das Video der Kamera ins lokale Netz streamt. Andere Anwendungen wie z.B. eine Bilderkennung können dann an anderen physischen Orten und mt besserer Hardware erfolgen. Die Kamera könnte z.B. am Bienenstand installiert werden, die KI-Auswertung des Videos aber mit einem “richtigen” Rechner im (Bienen-)Haus erfolgen.

Software-Installation

Wir verwenden dazu den example-sketch CameraWebServer (Achtung! mehrere Dateien), der mit dem Arduino-ESP32 core ausgeliefert wird, entweder unter arduino-esp32/libraries/ESP32/examples/Camera/CameraWebServer at master · espressif/arduino-esp32 · GitHub oder in der Arduino-IDE über

Datei > Beispiele > ESP32 > Camera > CameraWebServer

In der Datei CameraWebServer.ino ist default der ESP-EYE ausgewählt, wer den neueren ESP32S3-EYE oder ein anderes Modul hat, muss hier noch das entsprechende board spezifizieren. Weiter unten die WLAN-Zugangsdaten eintragen und das war es schon!

Beim Board ESP32 Dev Module auswählen und unter Partition Scheme Huge App auswählen, wird zumindest hier empfohlen. Dann compilieren / uploaden.

Nun den Seriellen Monitor öffnen, dort bekommt man nämlich die zugewiesene IP-Adresse zu sehen, die wir nun brauchen.

WiFi connected
Camera Ready! Use 'http://192.168.178.121' to connect

Der Stromverbrauch liegt bei um die 180 mA gemessen mit einem π x Daumen USB-Strommesser. Dabei war es unerheblich, ob gerade ein stream abgerufen wurde oder nicht.

Preview und Anzeigeoptionen ändern

Diese IP können wir erst mal in einen Webbrowser eingeben und sehen dann ein Konfigurationsmenü. Mit Klick auf Start Stream (etwas unglücklich weit unten in der UI angebracht) bekommt man auch eine preview des Videos angezeigt:

Default is QVGA mit 320 x 240 eingestellt, das gleich eimal auf HD (1280 x 720) ändern, Qualität auch etwas raufschrauben und ggf. V-Flip verwenden um das Video zu drehen.

Hier ist gerade schlechtes, nur wenig helles, indirektes Licht, die Qualität überzeugt mich nicht.

Stream-URL

Nun kommt der aufwändigste Teil (-: Wie ist denn die URL für den Stream? Das ist leider nicht eindeutig dokumentiert und ich musste etwas recherchieren und rumprobieren:

http://<deine-IP>:81/stream

also z.B. http://192.168.178.121:81/stream es muss als Port 81 angegeben werden und als path stream, dann funktioniert es auch mit dem Video!

Nun können wir z.B. über die direkte Eingabe der URL http://<deine-IP>:81/stream im Browser das Video aufrufen oder im VLC-Player via Netzwerkstream öffnen den stream anzeigen oder ihn über YOLO oder eine andere Bilderkennung weiterverarbeiten.

Aber Achtung! Der stream kann immer nur an eine einzige Stelle ausgeliefert werden. Wenn ihr also den Browser mit dem stream auf habt und Yolo partou nicht funktionieren möchte, einmal checken, ob der stream noch im Brower läuft und ggf. das tab erst schließen / stream beenden! Auch funktioniert das ganze nur im lokalen Netz! Nicht über euer privates Netz / WLAN hinaus! Der ESP-EYE und das anzeigende oder verarbeitende Gerät müssen im gleichen (W)LAN sein!

Stream mit YOLO weiterverarbeiten

Für Yolo wäre ein möglicher code

# import YOLO 
from ultralytics import YOLO

# load the YOLO11 medium model
model = YOLO("yolo11m.pt")

# define inference source 
source = "http://192.168.178.121:81/stream" # local ESP-EYE video stream 

# run inference on the source, streams have to run in a loop! 
for r in model(source, stream=True, conf=0.2, show=True, save=True):
    pass

Die Erkennungsleistung ist aber übel (hier yolo11m.pt als Modell), mein Handy ist öfter cat als remote control und meine Frau (im Wollpulli) wechselt von teddy bear über dog zu cat – noch findet sie es lustig! :-) Ich, mit Haaren im Gesicht, wechsle ebenfalls von person zu häufiger teddy bear! Ich schiebe es mal auf die schlechte Kamera!

Sonst läuft der stream und auch die Yolo-preview überraschend flüssig.