Pour OpenMV firmware v5.0.0 · basé sur MicroPython v1.28 · documentation générée le 19 juin 2026

Vision artificielle,
simplifiée.

Détection de visages en direct, suivi AprilTag, lecture QR et YOLO. Tout sur l'appareil, en MicroPython pur. Pas d'ordinateur hôte, pas de cloud.

Nouveautés Lire le journal des modifications du 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")

Suivi de personnes en temps réel

Le modèle YOLOv8 embarqué est un détecteur de personnes à classe unique — quantifié en int8 et fourni en ROM.

Chargé depuis /rom/yolov8n_192.tflite — aucune carte SD ni téléchargement requis.
Fonctionne en temps réel sur les cartes équipées d'un NPU — l'OpenMV N6 et l'AE3.
Apportez votre propre modèle YOLOv8 entraîné sur Roboflow et chargez-le de la même façon.
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")

Localiser et identifier des AprilTags

Les AprilTags sont des marqueurs fiduciaires 2D — robustes au flou de mouvement et à l'occultation partielle, et ils fournissent la pose 3D complète.

Détecteur intégré — aucun fichier de modèle ni entraînement requis.
Retourne l'ID ainsi que la pose complète à 6 degrés de liberté — translation x/y/z et rotation x/y/z.
Utilisez-les pour la calibration robotique, les marqueurs RA et le positionnement en intérieur.
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")

Détecter des visages avec BlazeFace

BlazeFace de Google est un détecteur de visages TensorFlow Lite léger qui retourne des boîtes englobantes et six points de repère par visage.

Chargé depuis /rom/blazeface_front_128.tflite — pré-quantifié, aucun téléchargement requis.
Six points clés par visage : yeux, nez, bouche et oreilles.
Aucun problème de confidentialité — les images ne quittent jamais la caméra.
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")

Scanner des codes QR depuis un flux en direct

Le décodeur QR intégré prend en charge les codes inclinés, déformés et partiellement occultés.

Chaque résultat expose également la version, le niveau ECC et les coordonnées des coins.
Modes de données numérique, alphanumérique, binaire et Kanji.
Retourne la charge utile décodée sous forme de chaîne Python — prête à l'emploi.
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")

Détecter des zones de couleur

find_blobs retourne des régions de pixels connectées correspondant à un ou plusieurs seuils LAB.

Ajustez les seuils en fonction de votre éclairage — désactivez d'abord le gain automatique et la balance des blancs automatique.
Passez plusieurs seuils pour le suivi multi-couleurs en un seul appel.
pixels_threshold filtre les petites détections ; merge=True fusionne les zones qui se chevauchent.
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")

Lire des codes-barres 1D

Trouvez des codes-barres 1D n'importe où dans l'image et décodez leur contenu.

Propulsé par la bibliothèque ZBar — reconnaît EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN et DataBar.
Utilisez une bande fenêtrée en niveaux de gris pour le balayage linéaire le plus rapide.
Chaque résultat contient le format, la charge utile, la rotation, les coins et un rectangle englobant.
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")

Suivre 21 points clés de la main

Le modèle MediaPipe Hand Landmarks de Google place 21 articulations sur chaque main détectée — poignet, jointures et bouts des doigts.

Chargé depuis /rom/hand_landmarks_full_224.tflite — fonctionne de manière autonome ici, sans détection de paume en amont.
Retourne une liste par main — l'indice 0 correspond à la main gauche, l'indice 1 à la main droite.
ml.utils.draw_skeleton dessine les 21 articulations et connexions en un seul appel.

Nouveau sur OpenMV ?

Commencez par le tutoriel pas à pas — il couvre la configuration du matériel, l'IDE, les scripts de base et des conseils pour votre premier vrai projet.

Bibliothèques principales

Matériel, caméras, traitement d'image, ndarrays, ML, multitâche, réseau, serveurs web et Bluetooth — tout depuis MicroPython.

Voir toutes les bibliothèques →

Explorer par carte

Sélectionnez votre caméra OpenMV pour voir son brochage, ses caractéristiques et son aide-mémoire spécifique à la carte.

Voir toutes les cartes prises en charge →

Shields

Cartes d'extension qui se branchent sur la caméra OpenMV — réseau, commande moteur, afficheurs et plus encore.

Voir tous les shields →

Capteurs

Modules caméra et adaptateurs de capteurs qui se branchent sur le connecteur carte-à-carte — vision couleur, monochrome, thermique et événementielle.

Voir tous les capteurs →

Ressources supplémentaires

Communauté & liens