Pentru OpenMV firmware v5.0.0 · bazat pe MicroPython v1.28 · documentație generată 19 iunie 2026

Vedere artificială,
simplificată.

Detectare live a fețelor, urmărire AprilTag, scanare QR și YOLO. Totul pe dispozitiv în MicroPython pur. Fără calculator gazdă, fără cloud.

Noutăți Citește jurnalul de modificări 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")

Urmărire persoane în timp real

Modelul YOLOv8 integrat este un detector de persoane cu o singură clasă — cuantificat int8 și furnizat în ROM.

Încărcat din /rom/yolov8n_192.tflite — nu este necesar card SD sau descărcare.
Rulează în timp real pe plăci echipate cu NPU — OpenMV N6 și AE3.
Aduce propriul model YOLOv8 antrenat pe Roboflow și încarcă-l în același mod.
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")

Localizează și identifică AprilTag-uri

AprilTag-urile sunt markeri fiduciali 2D — robuști la estomparea de mișcare și ocluzia parțială și furnizează poziția 3D completă.

Detector integrat — nu este necesar fișier de model sau antrenare.
Returnează ID-ul plus poziția completă cu 6 grade de libertate — translație x/y/z și rotație x/y/z.
Utilizare pentru calibrarea robotică, markeri AR și poziționare în interior.
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")

Detectează fețe cu BlazeFace

BlazeFace de la Google este un detector de fețe TensorFlow Lite ușor care returnează dreptunghiuri de delimitare plus șase puncte de referință per față.

Încărcat din /rom/blazeface_front_128.tflite — pre-cuantificat, nu este necesară descărcarea.
Șase puncte cheie per față: ochi, nas, gură și urechi.
Fără probleme de confidențialitate — cadrele nu părăsesc niciodată camera.
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")

Scanează coduri QR dintr-un flux live

Decodorul QR integrat gestionează coduri înclinate, distorsionate și parțial obstrucționate.

Fiecare rezultat expune de asemenea versiunea, nivelul ECC și coordonatele colțurilor.
Moduri de date numeric, alfanumeric, binar și Kanji.
Returnează conținutul decodat ca șir Python — gata de utilizare.
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")

Găsește regiuni de culoare

find_blobs returnează regiuni de pixeli conectați care corespund unuia sau mai multor praguri LAB.

Ajustează pragurile pentru iluminarea ta — dezactivează mai întâi câștigul automat și balansul de alb automat.
Transmite mai multe praguri pentru urmărirea multi-culoare într-un singur apel.
pixels_threshold filtrează detecțiile mici; merge=True unește regiunile suprapuse.
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")

Citește coduri de bare 1D

Găsește coduri de bare 1D oriunde în cadru și decodifică conținutul lor.

Alimentat de biblioteca ZBar — recunoaște EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN și DataBar.
Folosește o bandă delimitată în tonuri de gri pentru cea mai rapidă scanare liniară.
Fiecare rezultat conține format, conținut, rotație, colțuri și un dreptunghi de delimitare.
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")

Urmărește 21 de puncte cheie ale mâinii

Modelul MediaPipe Hand Landmarks de la Google plasează 21 de articulații pe fiecare mână detectată — încheietura, articulațiile degetelor și vârfurile degetelor.

Încărcat din /rom/hand_landmarks_full_224.tflite — rulează de sine stătător aici, fără detecție de palmă în amonte.
Returnează o listă per mână — indicele 0 este stânga, indicele 1 este dreapta.
ml.utils.draw_skeleton desenează toate cele 21 de articulații și conexiuni într-un singur apel.

Nou la OpenMV?

Începe cu tutorialul pas cu pas — acoperă configurarea hardware, IDE-ul, scripturile de bază și sfaturi pentru primul tău proiect real.

Biblioteci de bază

Hardware, camere, procesare de imagini, ndarray-uri, ML, multitasking, rețele, servere web și Bluetooth — totul din MicroPython.

Vezi toate bibliotecile →

Explorează după placă

Selectează OpenMV Cam pentru a vedea pinout-ul, specificațiile și referința rapidă specifică plăcii.

Vezi toate plăcile suportate →

Shield-uri

Plăci suplimentare care se conectează la OpenMV Cam — rețele, control motoare, ecrane și altele.

Vezi toate shield-urile →

Senzori

Module cameră și adaptoare de senzori care se conectează la conectorul placă-la-placă — viziune color, monocromă, termică și bazată pe evenimente.

Vezi toți senzorii →

Mai multe resurse

Comunitate & linkuri