Для мікропрограми OpenMV v5.0.0 · на основі MicroPython v1.28 · документація зібрана 18 червня 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")

Знаходити та ідентифікувати AprilTags

AprilTags — це двовимірні маркери-орієнтири, стійкі до розмиття руху та часткового перекриття, що забезпечують повну 3D-позицію.

Вбудований детектор — не потрібно файлів моделей або навчання.
Повертає ID та повну 6-DoF позицію — переміщення 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 та координати кутів.
Числові, буквено-цифрові, двійкові та Kanji режими даних.
Повертає декодований вміст як рядок 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-и, МН, багатозадачність, мережі, вебсервери та Bluetooth — усе через MicroPython.

Переглянути всі бібліотеки →

Огляд за платами

Оберіть свою OpenMV Cam, щоб переглянути розводку виводів, характеристики та швидкий довідник для плати.

Переглянути всі підтримувані плати →

Шилди

Додаткові плати для OpenMV Cam — мережі, керування моторами, дисплеї тощо.

Переглянути всі шилди →

Датчики

Модулі камери та адаптери датчиків для роз'єму плата-до-плати — кольорове, монохромне, тепловізійне та подієве бачення.

Переглянути всі датчики →

Більше ресурсів

Спільнота та посилання