Per OpenMV firmware v5.0.0 · basato su MicroPython v1.28 · documentazione aggiornata 19 giugno 2026

Machine vision,
resa semplice.

Rilevamento volti in tempo reale, tracciamento AprilTag, scansione QR e YOLO. Tutto sul dispositivo in puro MicroPython. Nessun computer host, nessun cloud.

What's new Leggi il changelog del firmware OpenMV 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")

Tracciamento persone in tempo reale

Il modello YOLOv8 integrato è un rilevatore di persone a singola classe — quantizzato int8 e incluso in ROM.

Caricato da /rom/yolov8n_192.tflite — nessuna scheda SD o download necessario.
Funziona in tempo reale sulle schede con NPU — OpenMV N6 e AE3.
Porta il tuo modello YOLOv8 addestrato su Roboflow e caricalo allo stesso modo.
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")

Localizza e identifica gli AprilTag

Gli AprilTag sono marcatori fiduciali 2D — robusti alla sfocatura da movimento e all'occlusione parziale, e forniscono la posa 3D completa.

Rilevatore integrato — nessun file modello o addestramento necessario.
Restituisce l'ID più la posa completa a 6 gradi di libertà — traslazione x/y/z e rotazione x/y/z.
Utile per la calibrazione robotica, i marcatori AR e il posizionamento interno.
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")

Rileva volti con BlazeFace

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

Caricato da /rom/blazeface_front_128.tflite — pre-quantizzato, nessun download necessario.
Sei keypoint per volto: occhi, naso, bocca e orecchie.
Nessun problema di privacy — i frame non lasciano mai la fotocamera.
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")

Scansiona codici QR da un feed live

Il decoder QR integrato gestisce codici inclinati, distorsi e parzialmente occlusi.

Ogni risultato espone anche versione, livello ECC e coordinate degli angoli.
Modalità dati numerica, alfanumerica, binaria e Kanji.
Restituisce il payload decodificato come stringa Python — pronto all'uso.
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")

Trova blob di colore

find_blobs restituisce regioni di pixel connesse che corrispondono a una o più soglie LAB.

Regola le soglie per la tua illuminazione — disabilita prima il guadagno automatico e il bilanciamento del bianco automatico.
Passa più soglie per il tracciamento multicolore in una sola chiamata.
pixels_threshold filtra le piccole rilevazioni; merge=True unisce i blob sovrapposti.
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")

Leggi codici a barre 1D

Trova codici a barre 1D ovunque nel frame e decodifica i loro payload.

Powered by the ZBar library — recognises EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN, and DataBar.
Usa una striscia a finestra in scala di grigi per la scansione lineare più veloce.
Ogni risultato ha formato, payload, rotazione, angoli e un rettangolo di delimitazione.
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")

Traccia 21 keypoint della mano

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

Caricato da /rom/hand_landmarks_full_224.tflite — eseguito in modo standalone, senza rilevamento del palmo a monte.
Restituisce un elenco per mano — indice 0 è la sinistra, indice 1 è la destra.
ml.utils.draw_skeleton disegna tutti i 21 giunti e le connessioni in una sola chiamata.

Nuovo su OpenMV?

Inizia con il tutorial passo-passo — copre la configurazione hardware, l'IDE, gli script di base e i suggerimenti per il tuo primo progetto reale.

Librerie principali

Hardware, fotocamere, elaborazione immagini, ndarray, ML, multitasking, networking, server web e Bluetooth — tutto da MicroPython.

Visualizza tutte le librerie →

Esplora per scheda

Seleziona la tua OpenMV Cam per vedere la piedinatura, le specifiche e il riferimento rapido specifico della scheda.

Visualizza tutte le schede supportate →

Shield

Schede aggiuntive che si collegano alla OpenMV Cam — rete, controllo motori, display e altro.

Visualizza tutti gli shield →

Sensori

Moduli fotocamera e adattatori sensore che si collegano al connettore board-to-board — visione a colori, monocromatica, termica e basata su eventi.

Visualizza tutti i sensori →

Altre risorse

Community & link