OpenMV-mjukvara v5.0.0 · baserad på MicroPython v1.28 · dokumentation byggd 19 juni 2026

Maskinseende,
enkelt gjort.

Ansiktsdetektering i realtid, AprilTag-spårning, QR-skanning och YOLO. Allt på enheten i ren MicroPython. Ingen värddator, inget moln.

Nyheter Läs OpenMV-mjukvarans v5.0.0 ändringslogg

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

Personspårning i realtid

Den inbyggda YOLOv8-modellen är en enklass-persondetekterare — int8-kvantiserad och levererad i ROM.

Laddas från /rom/yolov8n_192.tflite — inget SD-kort eller nedladdning behövs.
Körs i realtid på NPU-utrustade kort — OpenMV N6 och AE3.
Ta med din egen YOLOv8-modell tränad på Roboflow och ladda den på samma sätt.
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")

Hitta och identifiera AprilTags

AprilTags är 2D fiduciala markörer — robusta mot rörelseoskärpa och partiell ocklusion, och ger fullständig 3D-position.

Inbyggd detekterare — ingen modellfil eller träning behövs.
Returnerar ID plus fullständig 6-DoF-position — x/y/z-translation och x/y/z-rotation.
Används för robotkalibrering, AR-markörer och inomhuspositionering.
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")

Detektera ansikten med BlazeFace

Googles BlazeFace är en lättviktig TensorFlow Lite-ansiktsdetekterare som returnerar begränsningsboxar plus sex landmärken per ansikte.

Laddas från /rom/blazeface_front_128.tflite — förkvantiserad, ingen nedladdning behövs.
Sex nyckelpunkter per ansikte: ögon, näsa, mun och öron.
Inga integritetsproblem — bildrutor lämnar aldrig kameran.
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")

Skanna QR-koder från ett direktflöde

Den inbyggda QR-avkodaren hanterar lutade, förvrängda och delvis dolda koder.

Varje resultat exponerar även version, ECC-nivå och hörnkoordinater.
Numeriska, alfanumeriska, binära och Kanji datalägen.
Returnerar den avkodade nyttolasten som en Python-sträng — redo att använda.
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")

Hitta färgfläckar

find_blobs returnerar sammanhängande pixelregioner som matchar ett eller flera LAB-tröskelvärden.

Justera tröskelvärden för din belysning — inaktivera auto-gain och auto-whitebal först.
Ange flera tröskelvärden för flerfärgsspårning i ett anrop.
pixels_threshold filtrerar bort tiny detekteringar; merge=True sammanfogar överlappande fläckar.
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")

Läs 1D-streckkoder

Hitta 1D-streckkoder var som helst i bildrutan och avkoda deras nyttolaster.

Drivs av biblioteket ZBar — känner igen EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN och DataBar.
Använd en fönstrad remsa i gråskala för den snabbaste linjära skanningen.
Varje resultat har format, nyttolast, rotation, hörn och en begränsningsrekt.
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")

Spåra 21 handnyckelpunkter

Googles MediaPipe Hand Landmarks-modell placerar 21 leder på varje detekterad hand — handled, knogar och fingertoppar.

Laddas från /rom/hand_landmarks_full_224.tflite — körs fristående här, utan handflatedetektering uppströms.
Returnerar en lista per hand — index 0 är vänster, index 1 är höger.
ml.utils.draw_skeleton ritar alla 21 leder och förbindelser i ett anrop.

Ny på OpenMV?

Börja med den steg-för-steg-handledning — den täcker hårdvaruinställning, IDE:n, grundläggande skript och tips för ditt första riktiga projekt.

Kärnbibliotek

Hårdvara, kameror, bildbehandling, ndarrays, ML, multitasking, nätverk, webbservrar och Bluetooth — allt från MicroPython.

Visa alla bibliotek →

Utforska efter kort

Välj din OpenMV Cam för att se dess stiftlayout, specifikationer och kortspecifik snabbreferens.

Visa alla stödda kort →

Shields

Tillbehörskort som ansluts till OpenMV Cam — nätverk, motorstyrning, displayer och mer.

Visa alla shields →

Sensorer

Kameramoduler och sensoradaptrar som ansluts till kort-till-kort-kontakten — färg, monokrom, termisk och händelsebaserat seende.

Visa alla sensorer →

Fler resurser

Gemenskap & länkar