Para o firmware OpenMV v5.0.0 · baseado em MicroPython v1.28 · documentação compilada em 18 de junho de 2026

Visão por computador,
simplificada.

Deteção de faces em tempo real, rastreamento de AprilTag, leitura de QR e YOLO. Tudo no dispositivo em MicroPython puro. Sem computador anfitrião, sem nuvem.

Novidades Ler o changelog do firmware OpenMV v5.0.0

Olá, 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")

Rastreamento de pessoas em tempo real

O modelo YOLOv8 integrado é um detetor de pessoas de classe única — quantizado em int8 e fornecido em ROM.

Carregado de /rom/yolov8n_192.tflite — sem cartão SD nem descarga necessária.
Executa em tempo real em placas equipadas com NPU — o OpenMV N6 e AE3.
Carregue o seu próprio modelo YOLOv8 treinado no Roboflow e carregue-o da mesma forma.
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")

Localizar e identificar AprilTags

Os AprilTags são marcadores fiduciais 2D — robustos ao desfoque de movimento e oclusão parcial, e fornecem pose 3D completa.

Detetor integrado — não necessita de ficheiro de modelo nem de treino.
Devolve ID mais pose completa de 6-DoF — translação x/y/z e rotação x/y/z.
Use para calibração de robótica, marcadores AR e posicionamento 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")

Detetar faces com BlazeFace

O BlazeFace da Google é um detetor de faces TensorFlow Lite leve que devolve caixas delimitadoras mais seis pontos de referência por face.

Carregado de /rom/blazeface_front_128.tflite — pré-quantizado, sem necessidade de descarga.
Seis pontos-chave por face: olhos, nariz, boca e orelhas.
Sem preocupações de privacidade — os fotogramas nunca saem da 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")

Ler códigos QR a partir de uma transmissão em direto

O descodificador QR integrado trata de códigos inclinados, distorcidos e parcialmente ocluídos.

Cada resultado também expõe a versão, nível ECC e coordenadas dos cantos.
Modos de dados numérico, alfanumérico, binário e Kanji.
Devolve o conteúdo descodificado como uma string Python — pronto a 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")

Encontrar manchas de cor

find_blobs devolve regiões de pixels ligados que correspondem a um ou mais limiares LAB.

Ajuste os limiares para a sua iluminação — desative o ganho automático e o balanço de brancos automático primeiro.
Passe múltiplos limiares para rastreamento multi-cor numa única chamada.
pixels_threshold filtra deteções pequenas; merge=True une manchas sobrepostas.
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")

Ler códigos de barras 1D

Localize códigos de barras 1D em qualquer parte do fotograma e descodifique os seus conteúdos.

Desenvolvido pela biblioteca ZBar — reconhece EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN e DataBar.
Use uma faixa com janela em escala de cinzentos para a leitura linear mais rápida.
Cada resultado tem formato, conteúdo, rotação, cantos e um 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")

Rastrear 21 pontos-chave de mão

O modelo Hand Landmarks do MediaPipe da Google coloca 21 articulações em cada mão detetada — pulso, nós dos dedos e pontas dos dedos.

Carregado de /rom/hand_landmarks_full_224.tflite — a executar de forma autónoma aqui, sem deteção de palma a montante.
Devolve uma lista por mão — índice 0 é a esquerda, índice 1 é a direita.
ml.utils.draw_skeleton desenha todas as 21 articulações e ligações numa única chamada.

Novo no OpenMV?

Comece com o tutorial passo a passo — cobre a configuração do hardware, o IDE, scripts básicos e dicas para o seu primeiro projeto real.

Bibliotecas principais

Hardware, câmaras, processamento de imagem, ndarrays, ML, multitarefa, redes, servidores web e Bluetooth — tudo em MicroPython.

Ver todas as bibliotecas →

Explorar por placa

Selecione a sua OpenMV Cam para ver o seu pinout, especificações e referência rápida específica da placa.

Ver todas as placas suportadas →

Shields

Placas de expansão que se ligam à OpenMV Cam — conectividade de rede, controlo de motores, ecrãs e muito mais.

Ver todas as shields →

Sensores

Módulos de câmara e adaptadores de sensor que se ligam ao conector placa a placa — visão a cores, monocromática, térmica e baseada em eventos.

Ver todos os sensores →

Mais recursos

Comunidade & ligações