Pro OpenMV firmware v5.0.0 · na základě MicroPython v1.28 · dokumentace sestavena 19. června 2026

Strojové vidění,
jednoduše.

Detekce tváří v reálném čase, sledování AprilTag, skenování QR kódů a YOLO. Vše přímo v zařízení v čistém MicroPython. Bez hostitelského počítače, bez cloudu.

Co je nového Přečtěte si protokol změn OpenMV firmware v5.0.0

Hello world

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

Sledování osob v reálném čase

Integrovaný model YOLOv8 je detektor osob pro jednu třídu — kvantizovaný na int8 a uložený v ROM.

Načteno z /rom/yolov8n_192.tflite — není potřeba SD karta ani stahování.
Běží v reálném čase na deskách vybavených NPU — OpenMV N6 a AE3.
Přiveďte vlastní model YOLOv8 natrénovaný na Roboflow a načtěte ho stejným způsobem.
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")

Lokalizace a identifikace AprilTag

AprilTags jsou 2D referenční značky — odolné vůči rozmazání pohybem a částečnému zakrytí a poskytují úplnou 3D polohu.

Vestavěný detektor — není potřeba žádný soubor modelu ani trénování.
Vrací ID plus úplnou polohu 6-DoF — translaci x/y/z a rotaci x/y/z.
Používejte pro kalibraci robotiky, AR značky a vnitřní polohování.
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")

Detekce tváří pomocí BlazeFace

BlazeFace od Google je odlehčený detektor tváří TensorFlow Lite, který vrací ohraničující rámečky a šest klíčových bodů na každou tvář.

Načteno z /rom/blazeface_front_128.tflite — předkvantizováno, není třeba stahovat.
Šest klíčových bodů na tvář: oči, nos, ústa a uši.
Žádné obavy o soukromí — snímky nikdy neopustí kameru.
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")

Skenování QR kódů z živého přenosu

Vestavěný dekodér QR zpracovává nakloněné, zdeformované a částečně zakryté kódy.

Každý výsledek také zobrazuje verzi, úroveň ECC a souřadnice rohů.
Datové režimy: číselný, alfanumerický, binární a Kanji.
Vrací dekódovaný obsah jako řetězec Python — připraven k použití.
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")

Hledání barevných skvrn

find_blobs vrací propojené oblasti pixelů odpovídající jednomu nebo více prahovým hodnotám LAB.

Nastavte prahové hodnoty pro vaše osvětlení — nejprve vypněte automatický zesílení a automatické vyvážení bílé.
Předejte více prahových hodnot pro sledování více barev v jednom volání.
pixels_threshold filtruje malé detekce; merge=True spojuje překrývající se skvrny.
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")

Čtení 1D čárových kódů

Najděte 1D čárové kódy kdekoliv ve snímku a dekódujte jejich obsah.

Využívá knihovnu ZBar — rozpoznává EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN a DataBar.
Použijte okenní pruh v odstínech šedé pro nejrychlejší lineární skenování.
Každý výsledek obsahuje formát, obsah, rotaci, rohy a ohraničující obdélník.
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")

Sledování 21 klíčových bodů ruky

Model MediaPipe Hand Landmarks od Google umisťuje 21 kloubů na každou detekovanou ruku — zápěstí, klouby a špičky prstů.

Načteno z /rom/hand_landmarks_full_224.tflite — zde běží samostatně, bez předchozí detekce dlaně.
Vrací jeden seznam na ruku — index 0 je levá, index 1 je pravá.
ml.utils.draw_skeleton nakreslí všech 21 kloubů a spojení v jednom volání.

Jste noví v OpenMV?

Začněte podrobným tutoriálem — zahrnuje nastavení hardware, IDE, základní skripty a tipy pro první skutečný projekt.

Základní knihovny

Hardware, kamery, zpracování obrazu, pole ndarray, ML, multitasking, sítě, webové servery a Bluetooth — vše z MicroPython.

Zobrazit všechny knihovny →

Prozkoumat podle desky

Vyberte svůj OpenMV Cam a zobrazte jeho pinout, specifikace a rychlou referenci specifickou pro danou desku.

Zobrazit všechny podporované desky →

Rozšiřující desky

Doplňkové desky, které se připojují k OpenMV Cam — sítě, řízení motorů, displeje a další.

Zobrazit všechny rozšiřující desky →

Senzory

Kamerové moduly a senzorové adaptéry, které se připojují ke konektoru deska-deska — barevné, monochromatické, termální a vizuální senzory na bázi událostí.

Zobrazit všechny senzory →

Další zdroje

Komunita & odkazy