Para OpenMV versión v5.0.0 · basado en MicroPython v1.28 · documentación generada el 19 de junio de 2026

Visión artificial,
simplificada.

Detección de rostros en vivo, seguimiento de AprilTag, lectura de QR y YOLO. Todo en el dispositivo con puro MicroPython. Sin ordenador host, sin nube.

Novedades Leer el registro de cambios de OpenMV v5.0.0

Hola mundo

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

Seguimiento de personas en tiempo real

El modelo YOLOv8 integrado es un detector de personas de una sola clase — cuantificado en int8 e incluido en ROM.

Cargado desde /rom/yolov8n_192.tflite — no se necesita tarjeta SD ni descarga.
Se ejecuta en tiempo real en placas con NPU — la OpenMV N6 y la AE3.
Usa tu propio modelo YOLOv8 entrenado en Roboflow y cárgalo de la misma manera.
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")

Localiza e identifica AprilTags

Los AprilTags son marcadores fiduciales 2D — robustos ante el desenfoque de movimiento y oclusión parcial, y proporcionan pose 3D completa.

Detector integrado — no se necesita archivo de modelo ni entrenamiento.
Devuelve el ID más la pose completa de 6 DoF — traslación x/y/z y rotación x/y/z.
Útil para calibración robótica, marcadores de RA y posicionamiento en interiores.
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")

Detecta rostros con BlazeFace

BlazeFace de Google es un detector de rostros TensorFlow Lite ligero que devuelve cajas delimitadoras más seis puntos de referencia por rostro.

Cargado desde /rom/blazeface_front_128.tflite — precuantificado, no se necesita descarga.
Seis puntos clave por rostro: ojos, nariz, boca y orejas.
Sin preocupaciones de privacidad — los fotogramas nunca salen de la cámara.
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")

Escanea códigos QR desde una transmisión en vivo

El decodificador QR integrado gestiona códigos inclinados, distorsionados y parcialmente ocluidos.

Cada resultado también expone versión, nivel ECC y coordenadas de las esquinas.
Modos de datos numérico, alfanumérico, binario y Kanji.
Devuelve el contenido decodificado como cadena Python — listo para usar.
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")

Encuentra manchas de color

find_blobs devuelve regiones de píxeles conectadas que coinciden con uno o más umbrales LAB.

Ajusta los umbrales según tu iluminación — desactiva primero la ganancia automática y el balance de blancos automático.
Pasa múltiples umbrales para seguimiento multicolor en una sola llamada.
pixels_threshold filtra detecciones pequeñas; merge=True une manchas solapadas.
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")

Lee códigos de barras 1D

Encuentra códigos de barras 1D en cualquier parte del fotograma y decodifica su contenido.

Impulsado por la biblioteca ZBar — reconoce EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN y DataBar.
Usa una franja de ventana en escala de grises para el escaneo lineal más rápido.
Cada resultado tiene formato, contenido, rotación, esquinas y un rectángulo delimitador.
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")

Rastrea 21 puntos clave de la mano

El modelo Hand Landmarks de Google MediaPipe sitúa 21 articulaciones en cada mano detectada — muñeca, nudillos y yemas de los dedos.

Cargado desde /rom/hand_landmarks_full_224.tflite — se ejecuta de forma independiente aquí, sin detección de palma previa.
Devuelve una lista por mano — el índice 0 es la izquierda, el índice 1 es la derecha.
ml.utils.draw_skeleton dibuja las 21 articulaciones y sus conexiones en una sola llamada.

¿Nuevo en OpenMV?

Comienza con el tutorial paso a paso — cubre la configuración del hardware, el IDE, scripts básicos y consejos para tu primer proyecto real.

Bibliotecas principales

Hardware, cámaras, procesamiento de imagen, ndarrays, ML, multitarea, redes, servidores web y Bluetooth — todo desde MicroPython.

Ver todas las bibliotecas →

Explorar por placa

Selecciona tu OpenMV Cam para ver su diagrama de pines, especificaciones y referencia rápida específica de la placa.

Ver todas las placas compatibles →

Shields

Placas complementarias que se conectan a la OpenMV Cam — redes, control de motores, pantallas y más.

Ver todos los shields →

Sensores

Módulos de cámara y adaptadores de sensor que se conectan al conector de placa a placa — visión en color, monocromática, térmica y basada en eventos.

Ver todos los sensores →

Más recursos

Comunidad & enlaces