Za OpenMV firmware v5.0.0 · na osnovi MicroPython v1.28 · dokumentacija izgrađena 19. lipnja 2026.

Strojni vid,
učinjen jednostavnim.

Živo prepoznavanje lica, praćenje AprilTag, skeniranje QR i YOLO. Sve na uređaju u čistom MicroPython-u. Bez host računala, bez oblaka.

Što je novo Pročitaj OpenMV firmware v5.0.0 dnevnik promjena

Pozdrav svijetu

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

Praćenje osoba u stvarnom vremenu

Ugrađeni YOLOv8 model je detektor osoba jedne klase — int8 kvantiziran i isporučen u ROM-u.

Učitan iz /rom/yolov8n_192.tflite — nije potrebna SD kartica ili preuzimanje.
Radi u stvarnom vremenu na pločama opremljenim NPU — OpenMV N6 i AE3.
Donesite vlastiti YOLOv8 model treniran na Roboflow i učitajte ga na isti način.
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")

Pronađite i identificirajte AprilTag oznake

AprilTag su 2D fiducijalni markeri — robusni na zamagljenje pokretom i djelomično zaklanjanje, i daju punu 3D pozu.

Ugrađeni detektor — nije potrebna datoteka modela ni treniranje.
Vraća ID plus punu 6-DoF pozu — x/y/z translacija i x/y/z rotacija.
Koristite za kalibraciju robotike, AR markere i unutarnje pozicioniranje.
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")

Otkrijte lica s BlazeFace

Google BlazeFace je lagani TensorFlow Lite detektor lica koji vraća okvire granica plus šest ključnih točaka po licu.

Učitan iz /rom/blazeface_front_128.tflite — unaprijed kvantiziran, nije potrebno preuzimanje.
Šest ključnih točaka po licu: oči, nos, usta i uši.
Nema problema s privatnošću — okviri nikad ne napuštaju kameru.
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")

Skenirajte QR kodove iz živog prijenosa

Ugrađeni QR dekoder obrađuje nagnute, iskrivljene i djelomično zaklanjavane kodove.

Svaki rezultat također izlaže verziju, razinu ECC i koordinate kutova.
Numerički, alfanumerički, binarni i Kanji načini podataka.
Vraća dekodiranu korisnu poruku kao Python niz — spreman za upotrebu.
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")

Pronađite nakupine boje

find_blobs vraća spojene regije piksela koje odgovaraju jednom ili više LAB praga.

Podesite pragove za vaše osvjetljenje — prvo onemogućite auto-gain i auto-whitebal.
Proslijedite više pragova za višebojno praćenje u jednom pozivu.
pixels_threshold filtrira male detekcije; merge=True spaja preklapajuće nakupine.
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")

Čitajte 1D barkodove

Pronađite 1D barkodove bilo gdje u okviru i dekodirajte njihove korisne poruke.

Pogoni ga ZBar biblioteka — prepoznaje EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN i DataBar.
Koristite prozorsku traku u sivim tonovima za najbrže linearno skeniranje.
Svaki rezultat ima format, korisnu poruku, rotaciju, kutove i ograđujući pravokutnik.
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")

Praćenje 21 ključne točke ruke

Google MediaPipe Hand Landmarks model postavlja 21 zglob na svaku detektiranu ruku — zapešće, zglobovi prstiju i vrhovi prstiju.

Učitan iz /rom/hand_landmarks_full_224.tflite — ovdje se izvodi samostalno, bez detekcije dlana uzvodno.
Vraća jedan popis po ruci — indeks 0 je lijeva, indeks 1 je desna.
ml.utils.draw_skeleton crta svih 21 zglob i veze u jednom pozivu.

Novi ste u OpenMV-u?

Počnite s korak-po-korak vodičem — pokriva postavljanje hardvera, IDE, osnovne skripte i savjete za vaš prvi pravi projekt.

Temeljne biblioteke

Hardver, kamere, obrada slika, ndarray-i, ML, višezadaćnost, umrežavanje, web poslužitelji i Bluetooth — sve iz MicroPython-a.

Pogledaj sve biblioteke →

Istraži po ploči

Odaberite svoju OpenMV Cam za pregled rasporeda pinova, specifikacija i brzih referenci specifičnih za ploču.

Pogledaj sve podržane ploče →

Štitovi

Dodatne ploče koje se priključuju u OpenMV Cam — umrežavanje, upravljanje motorima, zasloni i više.

Pogledaj sve štitove →

Senzori

Moduli kamere i adapteri senzora koji se priključuju u konektor ploča-do-ploče — kolor, monokromatski, toplinski i vizija temeljena na događajima.

Pogledaj sve senzore →

Više resursa

Zajednica & poveznice