Oprogramowanie OpenMV v5.0.0 · oparte na MicroPython v1.28 · dokumentacja zbudowana 19 czerwca 2026

Wizja maszynowa,
uproszczona do granic możliwości.

Detekcja twarzy na żywo, śledzenie AprilTag, skanowanie QR i YOLO. Wszystko na urządzeniu w czystym MicroPython. Bez komputera hosta, bez chmury.

Co nowego Przeczytaj dziennik zmian oprogramowania OpenMV v5.0.0

Witaj świecie

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

Śledzenie osób w czasie rzeczywistym

Wbudowany model YOLOv8 to jednoklasowy detektor osób — skwantyzowany do int8 i dostarczany w ROM.

Wczytywany z /rom/yolov8n_192.tflite — nie wymaga karty SD ani pobierania.
Działa w czasie rzeczywistym na płytkach wyposażonych w NPU — OpenMV N6 i AE3.
Przynieś własny model YOLOv8 wytrenowany na Roboflow i wczytaj go w ten sam sposób.
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")

Lokalizuj i identyfikuj AprilTags

AprilTags to dwuwymiarowe znaczniki fiducjalne — odporne na rozmycie ruchu i częściowe zasłonięcie, zapewniające pełną pozę 3D.

Wbudowany detektor — nie wymaga pliku modelu ani trenowania.
Zwraca ID oraz pełną pozę 6-DoF — translację x/y/z i obrót x/y/z.
Stosuj do kalibracji robotyki, znaczników AR i pozycjonowania wewnętrznego.
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")

Wykrywaj twarze za pomocą BlazeFace

BlazeFace od Google to lekki detektor twarzy TensorFlow Lite, który zwraca prostokąty ograniczające oraz sześć punktów charakterystycznych na twarz.

Wczytywany z /rom/blazeface_front_128.tflite — wstępnie skwantyzowany, bez konieczności pobierania.
Sześć punktów kluczowych na twarz: oczy, nos, usta i uszy.
Żadnych obaw o prywatność — klatki nigdy nie opuszczają kamery.
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")

Skanuj kody QR z transmisji na żywo

Wbudowany dekoder QR obsługuje kody pochylone, zniekształcone i częściowo zasłonięte.

Każdy wynik udostępnia też wersję, poziom ECC i współrzędne narożników.
Tryby danych: numeryczny, alfanumeryczny, binarny i Kanji.
Zwraca zdekodowaną zawartość jako ciąg Python — gotowy do użycia.
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")

Znajdź obszary koloru

find_blobs zwraca połączone regiony pikseli pasujące do jednego lub więcej progów LAB.

Dostosuj progi do swojego oświetlenia — najpierw wyłącz automatyczne wzmocnienie i automatyczny balans bieli.
Przekaż wiele progów, aby śledzić wiele kolorów w jednym wywołaniu.
pixels_threshold filtruje małe wykrycia; merge=True łączy nakładające się obszary.
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")

Odczytuj kody kreskowe 1D

Znajdź kody kreskowe 1D w dowolnym miejscu klatki i zdekoduj ich zawartość.

Obsługiwane przez bibliotekę ZBar — rozpoznaje EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN i DataBar.
Użyj okienkowego paska w skali szarości, aby uzyskać najszybsze skanowanie liniowe.
Każdy wynik zawiera format, zawartość, obrót, narożniki i prostokąt ograniczający.
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")

Śledź 21 punktów kluczowych dłoni

Model MediaPipe Hand Landmarks od Google umieszcza 21 stawów na każdej wykrytej dłoni — nadgarstek, knykcie i opuszki palców.

Wczytywany z /rom/hand_landmarks_full_224.tflite — działa samodzielnie, bez wcześniejszego wykrywania dłoni.
Zwraca jedną listę na dłoń — indeks 0 to lewa, indeks 1 to prawa.
ml.utils.draw_skeleton rysuje wszystkie 21 stawów i połączeń w jednym wywołaniu.

Nowy w OpenMV?

Zacznij od samouczka krok po kroku — obejmuje konfigurację sprzętu, IDE, podstawowe skrypty i wskazówki do pierwszego prawdziwego projektu.

Podstawowe biblioteki

Sprzęt, kamery, przetwarzanie obrazu, ndarrays, ML, wielozadaniowość, sieć, serwery WWW i Bluetooth — wszystko z MicroPython.

Zobacz wszystkie biblioteki →

Przeglądaj według płytki

Wybierz swój OpenMV Cam, aby zobaczyć rozkład pinów, dane techniczne i skrócony opis dla danej płytki.

Zobacz wszystkie obsługiwane płytki →

Nakładki

Nakładki podłączane do OpenMV Cam — sieć, sterowanie silnikami, wyświetlacze i nie tylko.

Zobacz wszystkie nakładki →

Sensory

Moduły kamer i adaptery sensorów podłączane przez złącze board-to-board — wizja kolorowa, monochromatyczna, termiczna i zdarzeniowa.

Zobacz wszystkie sensory →

Więcej zasobów

Społeczność & linki