OpenMV firmware v5.0.0 · MicroPython v1.28 alapján · dokumentáció építve: 2026. június 19.

Gépi látás,
egyszerűen.

Élő arcfelismerés, AprilTag követés, QR szkennelés és YOLO. Minden az eszközön, tiszta MicroPython-ban. Nincs szükség gazdagépre vagy felhőre.

Mi az újdonság Olvassa el az OpenMV firmware v5.0.0 változásnaplóját

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

Valós idejű személykövetés

A beépített YOLOv8 modell egyosztályos személydetektor — int8 kvantált és ROM-ban szállított.

Betöltve a /rom/yolov8n_192.tflite fájlból — nincs szükség SD kártyára vagy letöltésre.
Valós időben fut NPU-val felszerelt lapokon — az OpenMV N6-on és AE3-on.
Hozza saját YOLOv8 modelljét, amelyet a Roboflow segítségével tanított, és töltse be ugyanúgy.
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-ek megkeresése és azonosítása

Az AprilTag-ek 2D referencia markerek — mozgási elmosódással és részleges takarással szemben robusztusak, és teljes 3D-s pozíciót adnak.

Beépített detektor — nincs szükség modell fájlra vagy tanításra.
Visszaadja az azonosítót és a teljes 6-DoF pozíciót — x/y/z eltolás és x/y/z forgás.
Robotikai kalibráláshoz, AR jelölőkhöz és beltéri pozicionáláshoz használható.
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")

Arcfelismerés BlazeFace segítségével

A Google BlazeFace egy könnyűsúlyú TensorFlow Lite arcfelismerő, amely befoglaló téglalapokat és hat mérföldkövet ad vissza arconként.

Betöltve a /rom/blazeface_front_128.tflite fájlból — előre kvantált, nincs szükség letöltésre.
Hat kulcspont arconként: szemek, orr, száj és fülek.
Nincs adatvédelmi aggály — a képkockák soha nem hagyják el a kamerát.
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 kódok szkennelése élő adatfolyamból

A beépített QR dekóder kezeli a döntött, torzított és részben takart kódokat.

Minden eredmény tartalmazza a verziót, az ECC szintet és a sarokkoordinátákat.
Numerikus, alfanumerikus, bináris és Kanji adatmódok.
A dekódolt adatot Python karakterláncként adja vissza — azonnal használható.
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")

Színes foltok keresése

find_blobs visszaadja az egy vagy több LAB küszöbértéknek megfelelő összefüggő pixelrégiókat.

Hangolja a küszöbértékeket a megvilágításhoz — először tiltsa le az automatikus erősítést és fehéregyensúlyt.
Adjon meg több küszöbértéket a többszínű követéshez egyetlen hívásban.
pixels_threshold kiszűri az apró felismeréseket; merge=True összekapcsolja az átfedő foltokat.
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")

1D vonalkódok olvasása

Keressen 1D vonalkódokat bárhol a képkockában és dekódolja azok tartalmát.

A ZBar könyvtár hajtja — felismeri az EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN és DataBar kódokat.
Használjon szürkeárnyalatos ablakos sávot a leggyorsabb lineáris szkenneléshez.
Minden eredmény tartalmaz formátumot, tartalmat, forgatást, sarkokat és befoglaló téglalapot.
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 kéz kulcspont követése

A Google MediaPipe Hand Landmarks modell 21 ízületet helyez el minden felismert kézen — csukló, ujjpercek és ujjhegyek.

Betöltve a /rom/hand_landmarks_full_224.tflite fájlból — itt önállóan fut, tenyérfelismerés nélkül.
Kézenként egy listát ad vissza — a 0. index a bal, az 1. index a jobb kéz.
ml.utils.draw_skeleton egyetlen hívásban rajzolja meg mind a 21 ízületet és azok kapcsolatait.

Új az OpenMV-nél?

Kezdje a lépésről lépésre haladó útmutatóval — lefedi a hardver beállítását, az IDE-t, az alapvető szkripteket és tippeket az első valódi projekthez.

Alapkönyvtárak

Hardver, kamerák, képfeldolgozás, ndarray-ok, ML, többfeladatos végrehajtás, hálózatkezelés, webszerverek és Bluetooth — mind MicroPython-ból.

Az összes könyvtár megtekintése →

Felfedezés lap szerint

Válassza ki az OpenMV Cam-jét a lábkiosztás, specifikációk és lapspecifikus gyors referencia megtekintéséhez.

Az összes támogatott lap megtekintése →

Pajzsok

Az OpenMV Cam-hez csatlakoztatható bővítő lapok — hálózatkezelés, motormeghajtás, kijelzők és még sok más.

Az összes pajzs megtekintése →

Érzékelők

Kameramodulok és érzékelő adapterek, amelyek a lap-lap csatlakozóba dughatók — színes, monokróm, hőkamerás és eseményalapú látás.

Az összes érzékelő megtekintése →

További erőforrások

Közösség & linkek