Maschinelles Sehen,
leicht gemacht.
Live-Gesichtserkennung, AprilTag-Verfolgung, QR-Scanning und YOLO. Alles auf dem Gerät in reinem MicroPython. Kein Host-Computer, keine Cloud.
IDE öffnen
OpenMV IDE für Windows, macOS oder Linux herunterladen, installieren und starten.
Kamera verbinden
OpenMV Cam per USB mit dem Computer verbinden. Eine blaue Heartbeat-LED blinkt, wenn die Kamera bereit ist.
Erstes Skript ausführen
Den Verbindungsknopf (Steckersymbol) in der IDE anklicken, dann den grünen Pfeil drücken, um das erste Skript auszuführen.
Hallo Welt
Beispieleimport csi
import time
import ml
from ml.postprocessing.ultralytics import YoloV8
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.snapshot(time=2000) # let AWB/AGC stabilize
# Built-in single-class person detector model.
model = ml.Model("/rom/yolov8n_192.tflite",
postprocess=YoloV8(threshold=0.4))
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# predict returns a list per class of ((x, y, w, h), score) tuples.
for class_dets in model.predict([img]):
for rect, score in class_dets:
img.draw_rectangle(rect, color=(0, 255, 0))
print(clock.fps(), "fps")
Personenverfolgung in Echtzeit
Das integrierte YOLOv8-Modell ist ein Einzelklassen-Personendetektor — int8-quantisiert und im ROM enthalten.
/rom/yolov8n_192.tflite — keine SD-Karte oder Download erforderlich.import csi
import math
import time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000) # let AWB/AGC stabilize
csi0.auto_gain(False)
csi0.auto_whitebal(False)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for tag in img.find_apriltags():
img.draw_detection(tag, color1=(255, 0, 0), color2=(0, 255, 0))
deg = math.degrees(tag.rotation)
print("ID %d rotation %.1f deg" % (tag.id, deg))
print(clock.fps(), "fps")
AprilTags lokalisieren und identifizieren
AprilTags sind 2D-Referenzmarker — robust gegen Bewegungsunschärfe und teilweise Verdeckung, und liefern die vollständige 3D-Pose.
x/y/z-Translation und x/y/z-Rotation.import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400)) # square window for best results
csi0.snapshot(time=2000) # let AWB/AGC stabilize
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace(threshold=0.4))
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for rect, score, keypoints in model.predict([img]):
img.draw_rectangle(rect, color=(0, 0, 255))
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
print(clock.fps(), "fps")
Gesichter mit BlazeFace erkennen
Googles BlazeFace ist ein schlanker TensorFlow Lite-Gesichtsdetektor, der Begrenzungsrahmen und sechs Landmarken pro Gesicht zurückgibt.
/rom/blazeface_front_128.tflite — vorquantisiert, kein Download erforderlich.import csi
import time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000) # let AWB/AGC stabilize
csi0.auto_gain(False)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for code in img.find_qrcodes():
img.draw_rectangle(code.rect, color=(255, 0, 0))
print(code.payload)
print(clock.fps(), "fps")
QR-Codes aus einem Live-Bild scannen
Der eingebaute QR-Decoder verarbeitet gekippte, verzerrte und teilweise verdeckte Codes.
import csi
import time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000) # let AWB/AGC stabilize
csi0.auto_gain(False)
csi0.auto_whitebal(False)
# LAB thresholds: (L_min, L_max, A_min, A_max, B_min, B_max)
thresholds = [
(30, 100, 15, 127, 15, 127), # red
(30, 100, -64, -8, -32, 32), # green
]
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for blob in img.find_blobs(thresholds, pixels_threshold=200):
img.draw_rectangle(blob.rect, color=(255, 0, 0))
img.draw_cross((blob.cx, blob.cy))
print(clock.fps(), "fps")
Farbbereiche finden
find_blobs gibt zusammenhängende Pixelbereiche zurück, die einem oder mehreren LAB-Schwellenwerten entsprechen.
pixels_threshold filtert winzige Erkennungen; merge=True verbindet überlappende Bereiche.import csi
import time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.VGA)
csi0.window((640, 80)) # narrow strip for fast linear scanning
csi0.snapshot(time=2000) # let AWB/AGC stabilize
csi0.auto_gain(False)
csi0.auto_whitebal(False)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for code in img.find_barcodes():
img.draw_rectangle(code.rect, color=(0, 255, 0))
print(code.payload, "(quality %d)" % code.quality)
print(clock.fps(), "fps")
1D-Barcodes lesen
1D-Barcodes an beliebiger Stelle im Bild finden und deren Inhalte dekodieren.
import csi
import time
import ml
from ml.postprocessing.mediapipe import HandLandmarks
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400)) # square window for the model
csi0.snapshot(time=2000) # let AWB/AGC stabilize
# Connections between the 21 keypoints — palm + 5 fingers.
hand_lines = ((0, 1), (1, 2), (2, 3), (3, 4), (0, 5), (5, 6),
(6, 7), (7, 8), (5, 9), (9, 10), (10, 11), (11, 12),
(9, 13), (13, 14), (14, 15), (15, 16), (13, 17), (17, 18),
(18, 19), (19, 20), (0, 17))
model = ml.Model("/rom/hand_landmarks_full_224.tflite",
postprocess=HandLandmarks(threshold=0.4))
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# predict returns a list per hand: index 0 = left, index 1 = right.
for detections in model.predict([img]):
for rect, score, keypoints in detections:
ml.utils.draw_skeleton(img, keypoints, hand_lines,
kp_color=(255, 0, 0),
line_color=(0, 255, 0))
print(clock.fps(), "fps")
21 Hand-Schlüsselpunkte verfolgen
Googles MediaPipe-Hand-Landmarken-Modell platziert 21 Gelenke auf jeder erkannten Hand — Handgelenk, Knöchel und Fingerspitzen.
/rom/hand_landmarks_full_224.tflite — hier eigenständig ausgeführt, ohne vorgelagerte Handflächen-Erkennung.ml.utils.draw_skeleton zeichnet alle 21 Gelenke und Verbindungen in einem einzigen Aufruf.Neu bei OpenMV?
Mit dem schrittweisen Tutorial beginnen — es behandelt Hardware-Einrichtung, die IDE, grundlegende Skripte und Tipps für das erste echte Projekt.
Kernbibliotheken
APIHardware, Kameras, Bildverarbeitung, ndarrays, ML, Multitasking, Netzwerk, Webserver und Bluetooth — alles aus MicroPython.
machine
Hardware auf unterster Ebene: GPIO, SPI, I²C, UART, PWM, ADC und Timer.
Erkunden →csi
Kamerasteuerung: Pixelformate, Bildgrößen, Belichtung, Verstärkung und Weißabgleich.
Erkunden →image
Maschinelles Sehen: Blobs, Kanten, Linien, Kreise, Merkmale und Zeichnen.
Erkunden →ulab
Numerisches Rechnen auf dem Gerät — ndarrays, FFTs und lineare Algebra.
Erkunden →ml
Neuronale Netzwerkinferenz auf dem Gerät — klassifizieren, erkennen und segmentieren.
Erkunden →asyncio
Kooperatives Multitasking — Kamera, Netzwerk und I/O parallel betreiben.
Erkunden →network
Wi-Fi, Ethernet und Sockets für IoT und Fernkommunikation.
Erkunden →microdot
Minimaler HTTP-Server — Routen, Sitzungen, Anmeldung, SSE und WebSockets.
Erkunden →aioble
Asynchrones Bluetooth Low Energy — Peripheriegeräte, Werbung und GATT.
Erkunden →Nach Board erkunden
HardwareOpenMV Cam auswählen, um Pinbelegung, technische Daten und boardspezifische Kurzreferenz anzuzeigen.

OpenMV N6 Neu
STM32N6 mit integriertem NPU — STMicros erster KI-beschleunigter Mikrocontroller.
Erkunden →
OpenMV AE3 Neu
Alif Ensemble E3 — Fusion-Klasse Cortex-M55 mit Ethos-U55 NPU.
Erkunden →
OpenMV RT1062
NXP i.MX RT1062 Cortex-M7 mit 600 MHz und 32 MB externem SDRAM.
Erkunden →
OpenMV H7 Plus
STM32H743 mit 32 MB externem SDRAM und einem 5-MP-OV5640-Sensor.
Erkunden →
OpenMV H7
STM32H743 Cortex-M7 mit wechselbarem Bildsensormodul.
Erkunden →
Arduino Nicla Vision
Kompaktes 23 × 23 mm STM32H747-Board mit integriertem Sensor.
Erkunden →
Arduino Portenta
STM32H747 mit 8 MB SDRAM und Vision-Shield-Unterstützung.
Erkunden →
Arduino Giga
STM32H747 mit 8 MB SDRAM, Vision- und Display-Shield-Unterstützung.
Erkunden →Shields
ErweiterungenErweiterungsboards, die in die OpenMV Cam eingesteckt werden — Netzwerk, Motorsteuerung, Displays und mehr.

Gigabit PoE Shield
Gigabit-Ethernet mit PoE für Streaming mit höherer Bandbreite.
Erkunden →
Servo Shield
Bis zu 4 Servos mit bis zu 5 A betreiben und gleichzeitig die Kamera versorgen, 6–36-V-Eingang.
Erkunden →
Battery Shield
1,8–5,5-V-Batterieeingang über einen DC-Hohlstecker.
Erkunden →
Touch LCD Shield
2,3" SPI-LCD mit kapazitivem Multi-Touch und Qwiic.
Erkunden →
PoE Shield
10/100-Ethernet mit Power-over-Ethernet.
Erkunden →
PIR Shield
6-µA-Standby-Bewegungsauslöser plus weißes und 850-nm-IR-Licht.
Erkunden →
CAN/RS232 Shield
8 Mb/s CAN-FD plus 1 Mb/s RS-232 in einem Shield.
Erkunden →
RS422/RS485 Shield
10-Mb/s-Differenzielle Serielle Schnittstelle für Industriebusse.
Erkunden →Sensoren
KameramoduleKameramodule und Sensoradapter, die in den Board-to-Board-Stecker eingesteckt werden — Farb-, Monochrom-, Wärme- und ereignisbasierte Bilderfassung.

PS5520 5MP HDR Camera
5-MP-HDR-Sensor — hoher Dynamikumfang für schwierige Lichtverhältnisse.
Erkunden →
Multispectral Thermal (PAG7936)
1-MP-Global-Shutter-Farbe + FLIR Lepton Wärmebildgebung auf einem Modul.
Erkunden →
Multispectral Thermal (OV5640)
5-MP-Rolling-Shutter-Farbe + FLIR Lepton Wärmebildgebung auf einem Modul.
Erkunden →
Multispectral Event Camera
GENX320-Ereignissensor + PAG7936-Farbe auf einem Modul.
Erkunden →
GENX320 Event Camera
Prophesee-ereignisbasierte Bilderfassung — zeitliche Präzision im Mikrosekundenbereich.
Erkunden →
FLIR Boson Adapter
Adapter für FLIR Boson / Boson+ — Wärmebildgebung mit höherer Auflösung.
Erkunden →
FLIR Lepton Adapter
Adapter für FLIR Lepton 1.x / 2.x / 3.x Wärmebildkerne.
Erkunden →
Global Shutter Camera Module
Monochromer Global-Shutter-Sensor für schnelle Bewegungsaufnahmen.
Erkunden →