Voor OpenMV firmware v5.0.0 · gebaseerd op MicroPython v1.28 · docs gebouwd 19 juni 2026

Machine vision,
eenvoudig gemaakt.

Live gezichtsdetectie, AprilTag-tracking, QR-scannen en YOLO. Alles op het apparaat zelf in pure MicroPython. Geen hostcomputer, geen cloud.

What's new Lees de OpenMV firmware v5.0.0 changelog

Hallo wereld

import 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")

Realtime persoonsdetectie

Het ingebouwde YOLOv8-model is een eenklasse-persoonsdetector — int8-gekwantiseerd en meegeleverd in ROM.

Geladen van /rom/yolov8n_192.tflite — geen SD-kaart of download nodig.
Draait realtime op boards met NPU — de OpenMV N6 en AE3.
Breng uw eigen YOLOv8-model getraind op Roboflow mee en laad het op dezelfde manier.
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 lokaliseren en identificeren

AprilTags zijn 2D-fiduciaire markeringen — robuust tegen bewegingsonscherpte en gedeeltelijke occlusie, en ze geven volledige 3D-positiebepaling.

Ingebouwde detector — geen modelbestand of training nodig.
Retourneert ID plus volledige 6-DoF-positie — x/y/z-translatie en x/y/z-rotatie.
Geschikt voor roboticakalibratie, AR-markeringen en binnenpositiebepaling.
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")

Gezichten detecteren met BlazeFace

Google's BlazeFace is a lightweight TensorFlow Lite face detector that returns bounding boxes plus six landmarks per face.

Geladen van /rom/blazeface_front_128.tflite — vooraf gekwantiseerd, geen download nodig.
Zes knooppunten per gezicht: ogen, neus, mond en oren.
Geen privacyzorgen — beelden verlaten de camera nooit.
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 scannen vanuit een live beeld

De ingebouwde QR-decoder verwerkt gekantelde, vervormde en gedeeltelijk bedekte codes.

Elk resultaat bevat ook versie, ECC-niveau en hoekcoördinaten.
Numerieke, alfanumerieke, binaire en Kanji-gegevensmodi.
Retourneert de gedecodeerde inhoud als een Python-string — direct bruikbaar.
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")

Kleurvlekken vinden

find_blobs retourneert aaneengesloten pixelgebieden die overeenkomen met een of meer LAB-drempelwaarden.

Stel drempelwaarden af op uw verlichting — schakel automatische versterking en automatische witbalans eerst uit.
Geef meerdere drempelwaarden door voor meerkleurige tracking in één aanroep.
pixels_threshold filtert kleine detecties; merge=True voegt overlappende vlekken samen.
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 lezen

Vind 1D-barcodes overal in het beeld en decodeer hun inhoud.

Powered by the ZBar library — recognises EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN, and DataBar.
Gebruik een venstersstrook in grijstinten voor de snelste lineaire scan.
Elk resultaat bevat formaat, inhoud, rotatie, hoeken en een begrenzingsrechthoek.
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 handknooppunten volgen

Google's MediaPipe Hand Landmarks model places 21 joints on each detected hand — wrist, knuckles, and fingertips.

Geladen van /rom/hand_landmarks_full_224.tflite — hier zelfstandig uitgevoerd, zonder palmdetectie vooraf.
Retourneert één lijst per hand — index 0 is links, index 1 is rechts.
ml.utils.draw_skeleton tekent alle 21 gewrichten en verbindingen in één aanroep.

Nieuw bij OpenMV?

Begin met de stapsgewijze tutorial — hierin komen hardwareopstelling, de IDE, basisscripts en tips voor uw eerste echte project aan bod.

Kernbibliotheken

Hardware, camera’s, beeldverwerking, ndarrays, ML, multitasking, netwerken, webservers en Bluetooth — allemaal vanuit MicroPython.

Bekijk alle bibliotheken →

Verkennen per board

Selecteer uw OpenMV Cam om de pinout, specificaties en boardspecifieke snelreferentie te bekijken.

Bekijk alle ondersteunde boards →

Shields

Add-onboards die op de OpenMV Cam worden aangesloten — netwerken, motorbesturing, beeldschermen en meer.

Bekijk alle shields →

Sensoren

Cameramodules en sensoradapters die worden aangesloten op de board-to-board-connector — kleur, monochroom, thermisch en op gebeurtenissen gebaseerde beeldverwerking.

Bekijk alle sensoren →

Meer bronnen

Community & links