OpenMV-laiteohjelmisto v5.0.0 · perustuu MicroPython v1.28 · dokumentaatio julkaistu 19. kesäkuuta 2026

Konenäkö,
yksinkertaistettuna.

Reaaliaikainen kasvojentunnistus, AprilTag-seuranta, QR-skannaus ja YOLO. Kaikki laitteella pelkässä MicroPythonissa. Ei isäntätietokonetta, ei pilveä.

Mitä uutta Lue OpenMV-laiteohjelmiston v5.0.0 muutosloki

Hei maailma

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

Reaaliaikainen henkilöseuranta

Sisäänrakennettu YOLOv8-malli on yksipuolilainen henkilöntunnistin — int8-kvantisoitu ja toimitettu ROM:issa.

Ladataan kohteesta /rom/yolov8n_192.tflite — ei SD-korttia tai latausta tarvita.
Toimii reaaliajassa NPU:lla varustetuilla laudoilla — OpenMV N6 ja AE3.
Tuo oma YOLOv8-mallisi, joka on koulutettu Roboflowssa, ja lataa se samalla tavalla.
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")

Paikanna ja tunnista AprilTagit

AprilTagit ovat 2D-viitemerkkejä — kestäviä liikesumuutokselle ja osittaiselle peittymiselle, ja ne antavat täyden 3D-asennon.

Sisäänrakennettu tunnistin — ei mallia tai harjoittelua tarvita.
Palauttaa tunnisteen sekä täyden 6-DoF-asennon — x/y/z-siirtymä ja x/y/z-kierto.
Käytä robotiikan kalibrointiin, AR-merkkeihin ja sisätilapaikannukseen.
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")

Tunnista kasvoja BlazeFacella

Googlen BlazeFace on kevyt TensorFlow Lite -kasvontunnistin, joka palauttaa rajoitusruudut sekä kuusi maamerkkiä per kasvot.

Ladataan kohteesta /rom/blazeface_front_128.tflite — ennalta kvantisoitu, ei latausta tarvita.
Kuusi avainpistettä per kasvot: silmät, nenä, suu ja korvat.
Ei tietosuojahuolia — kuvat eivät koskaan poistu kamerasta.
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")

Skannaa QR-koodeja reaaliaikaisesta kuvasta

Sisäänrakennettu QR-dekooderi käsittelee kallistuneita, vääristyneitä ja osittain peittyneitä koodeja.

Jokainen tulos paljastaa myös version, ECC-tason ja kulmakoordinaatit.
Numeeriset, aakkosnumeeriset, binääriset ja Kanji-datatilat.
Palauttaa dekoodatun sisällön Python-merkkijonona — valmis käytettäväksi.
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")

Löydä väriläiskiä

find_blobs palauttaa yhtenäisiä pikselialueita, jotka vastaavat yhtä tai useampaa LAB-kynnysarvoa.

Säädä kynnysarvot valaistuksellesi — poista automaattivahvistus ja automaattinen valkotasapaino ensin käytöstä.
Anna useita kynnysarvoja moniväriseurantaan yhdellä kutsulla.
pixels_threshold suodattaa pienet havainnot; merge=True yhdistää päällekkäiset läiskät.
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")

Lue 1D-viivakoodeja

Löydä 1D-viivakoodeja mistä tahansa kuvan kohdasta ja dekoodaa niiden sisältö.

Perustuu ZBar-kirjastoon — tunnistaa EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN ja DataBar.
Käytä ikkunoitua harmaasävykaistaa nopeimpaan lineaariseen skannaukseen.
Jokaisella tuloksella on formaatti, sisältö, kierto, kulmat ja rajoitussuorakaide.
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")

Seuraa 21 käden avainpistettä

Googlen MediaPipe Hand Landmarks -malli sijoittaa 21 niveltä jokaiselle havaitulle kädelle — ranne, nyrkkinivelet ja sormenpäät.

Ladataan kohteesta /rom/hand_landmarks_full_224.tflite — toimii itsenäisesti tässä, ilman ylöspäin tapahtuvaa kämmenentunnistusta.
Palauttaa yhden listan per käsi — indeksi 0 on vasen, indeksi 1 on oikea.
ml.utils.draw_skeleton piirtää kaikki 21 niveltä ja yhteydet yhdellä kutsulla.

Uusi OpenMV-käyttäjä?

Aloita vaiheittaisella opetusohjelmalla — se kattaa laitteiston asennuksen, IDE:n, perusskriptit ja vinkit ensimmäiseen todelliseen projektiisi.

Ydinkirjastot

Laitteisto, kamerat, kuvankäsittely, ndarray-taulukot, ML, rinnakkaistehtävät, verkkoliikenne, web-palvelimet ja Bluetooth — kaikki MicroPythonilla.

Näytä kaikki kirjastot →

Selaa laudan mukaan

Valitse OpenMV Cam nähdäksesi sen kytkentäkaavion, tekniset tiedot ja lautakohtaisen pikaviitteen.

Näytä kaikki tuetut laudat →

Suojalevyt

Lisäosalaudat, jotka kytkeytyvät OpenMV Cam -laitteeseen — verkkoliikenne, moottorin ohjaus, näytöt ja paljon muuta.

Näytä kaikki suojalevyt →

Anturit

Kameramoduulit ja anturiadapterit, jotka kytkeytyvät lauta-lauta-liittimeen — väri-, mustavalko-, lämpö- ja tapahtumanäkö.

Näytä kaikki anturit →

Lisää resursseja

Yhteisö & linkit