OpenMV прошивка v5.0.0 · на основе MicroPython v1.28 · документация собрана 19 июня 2026 г.

Машинное зрение,
доступно каждому.

Обнаружение лиц в реальном времени, отслеживание AprilTag, сканирование QR и YOLO. Всё на устройстве — на чистом MicroPython. Без компьютера и облака.

Что нового Читать журнал изменений прошивки 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")

Отслеживание людей в реальном времени

Встроенная модель YOLOv8 — детектор людей одного класса, квантованный до int8 и записанный в ROM.

Загружается из /rom/yolov8n_192.tflite — SD-карта и загрузка не нужны.
Работает в реальном времени на платах с NPU — OpenMV N6 и AE3.
Используйте собственную модель YOLOv8, обученную на Roboflow, и загружайте её аналогичным образом.
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")

Обнаружение и идентификация AprilTag

AprilTags — 2D-маркеры привязки, устойчивые к размытию при движении и частичному перекрытию; они возвращают полную 3D-позу.

Встроенный детектор — файл модели и обучение не нужны.
Возвращает ID и полную позу с 6 степенями свободы — смещение x/y/z и поворот x/y/z.
Применяется для калибровки робототехники, AR-маркеров и позиционирования в помещении.
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")

Обнаружение лиц с BlazeFace

BlazeFace от Google — лёгкий детектор лиц на TensorFlow Lite, возвращающий ограничивающие прямоугольники и шесть ключевых точек на каждое лицо.

Загружается из /rom/blazeface_front_128.tflite — предварительно квантована, загрузка не нужна.
Шесть ключевых точек на лицо: глаза, нос, рот и уши.
Никаких проблем с конфиденциальностью — кадры не покидают камеру.
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")

Сканирование QR-кодов из живого потока

Встроенный декодер QR обрабатывает повёрнутые, искажённые и частично перекрытые коды.

Каждый результат также содержит версию, уровень ECC и координаты углов.
Режимы данных: числовой, буквенно-цифровой, двоичный и кандзи.
Возвращает декодированные данные в виде строки Python — готово к использованию.
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")

Поиск цветовых областей

find_blobs возвращает связанные области пикселей, соответствующие одному или нескольким порогам LAB.

Настройте пороги под своё освещение — сначала отключите автоусиление и автобаланс белого.
Передайте несколько порогов для многоцветного отслеживания в одном вызове.
pixels_threshold фильтрует мелкие обнаружения; merge=True объединяет перекрывающиеся области.
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")

Чтение одномерных штрихкодов

Обнаруживайте одномерные штрихкоды в любом месте кадра и декодируйте их содержимое.

Работает на библиотеке ZBar — распознаёт EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN и DataBar.
Используйте полосу в оттенках серого для наиболее быстрого линейного сканирования.
Каждый результат содержит формат, данные, поворот, углы и ограничивающий прямоугольник.
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")

Отслеживание 21 ключевой точки руки

Модель MediaPipe Hand Landmarks от Google определяет 21 сустав на каждой обнаруженной руке — запястье, суставы пальцев и кончики пальцев.

Загружается из /rom/hand_landmarks_full_224.tflite — работает автономно, без предварительного обнаружения ладони.
Возвращает один список на каждую руку — индекс 0 — левая, индекс 1 — правая.
ml.utils.draw_skeleton рисует все 21 сустав и соединения за один вызов.

Впервые работаете с OpenMV?

Начните с пошагового руководства — оно охватывает настройку оборудования, IDE, базовые скрипты и советы для первого реального проекта.

Основные библиотеки

Оборудование, камеры, обработка изображений, массивы ndarray, ML, многозадачность, сеть, веб-серверы и Bluetooth — всё из MicroPython.

Все библиотеки →

Выбрать по плате

Выберите камеру OpenMV, чтобы увидеть распиновку, характеристики и краткий справочник для вашей платы.

Все поддерживаемые платы →

Шилды

Дополнительные платы, подключаемые к камере OpenMV, — сеть, управление моторами, дисплеи и многое другое.

Все шилды →

Датчики

Модули камер и адаптеры датчиков для межплатного разъёма — цветные, монохромные, тепловизионные и событийные.

Все датчики →

Дополнительные ресурсы

Сообщество & ссылки