Untuk firmware OpenMV v5.0.0 · berdasarkan MicroPython v1.28 · dokumen dibuat 18 Juni 2026

Visi mesin,
dibuat sederhana.

Deteksi wajah langsung, pelacakan AprilTag, pemindaian QR, dan YOLO. Semua di perangkat dalam MicroPython murni. Tanpa komputer host, tanpa cloud.

Yang baru Baca changelog firmware 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")

Pelacakan orang secara real-time

Model YOLOv8 bawaan adalah detektor orang satu kelas — dikuantisasi int8 dan disertakan dalam ROM.

Dimuat dari /rom/yolov8n_192.tflite — tidak memerlukan kartu SD atau unduhan.
Berjalan secara real time pada papan yang dilengkapi NPU — OpenMV N6 dan AE3.
Bawa model YOLOv8 Anda sendiri yang dilatih di Roboflow dan muat dengan cara yang sama.
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")

Temukan dan identifikasi AprilTag

AprilTag adalah penanda fiducial 2D — tahan terhadap motion blur dan oklusi sebagian, dan memberikan pose 3D penuh.

Detektor bawaan — tidak memerlukan file model atau pelatihan.
Mengembalikan ID ditambah pose 6-DoF penuh — translasi x/y/z dan rotasi x/y/z.
Gunakan untuk kalibrasi robotika, penanda AR, dan penentuan posisi dalam ruangan.
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")

Deteksi wajah dengan BlazeFace

BlazeFace milik Google adalah detektor wajah TensorFlow Lite ringan yang mengembalikan kotak pembatas ditambah enam landmark per wajah.

Dimuat dari /rom/blazeface_front_128.tflite — sudah dikuantisasi, tidak perlu diunduh.
Enam titik kunci per wajah: mata, hidung, mulut, dan telinga.
Tidak ada masalah privasi — bingkai tidak pernah meninggalkan kamera.
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")

Pindai kode QR dari siaran langsung

Dekoder QR bawaan menangani kode yang miring, terdistorsi, dan terhalang sebagian.

Setiap hasil juga mengekspos versi, level ECC, dan koordinat sudut.
Mode data numerik, alfanumerik, biner, dan Kanji.
Mengembalikan payload yang didekode sebagai string Python — siap digunakan.
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")

Temukan blob warna

find_blobs mengembalikan wilayah piksel yang terhubung yang cocok dengan satu atau lebih ambang batas LAB.

Sesuaikan ambang batas untuk pencahayaan Anda — nonaktifkan auto-gain dan auto-whitebal terlebih dahulu.
Berikan beberapa ambang batas untuk pelacakan multi-warna dalam satu panggilan.
pixels_threshold menyaring deteksi kecil; merge=True menggabungkan blob yang tumpang tindih.
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")

Baca kode batang 1D

Temukan kode batang 1D di mana saja dalam bingkai dan dekode payload-nya.

Didukung oleh pustaka ZBar — mengenali EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN, dan DataBar.
Gunakan strip berjendela dalam skala abu-abu untuk pemindaian linear tercepat.
Setiap hasil memiliki format, payload, rotasi, sudut, dan kotak pembatas.
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")

Lacak 21 titik kunci tangan

Model Hand Landmarks MediaPipe milik Google menempatkan 21 sendi pada setiap tangan yang terdeteksi — pergelangan tangan, buku jari, dan ujung jari.

Dimuat dari /rom/hand_landmarks_full_224.tflite — berjalan mandiri di sini, tanpa deteksi telapak tangan sebelumnya.
Mengembalikan satu daftar per tangan — indeks 0 adalah kiri, indeks 1 adalah kanan.
ml.utils.draw_skeleton menggambar semua 21 sendi dan koneksi dalam satu panggilan.

Baru mengenal OpenMV?

Mulailah dengan tutorial langkah demi langkah — ini mencakup penyiapan perangkat keras, IDE, skrip dasar, dan tips untuk proyek nyata pertama Anda.

Pustaka inti

Perangkat keras, kamera, pemrosesan citra, ndarray, ML, multitasking, jaringan, server web, dan Bluetooth — semua dari MicroPython.

Lihat semua pustaka →

Jelajahi berdasarkan papan

Pilih OpenMV Cam Anda untuk melihat pinout, spesifikasi, dan referensi cepat khusus papan.

Lihat semua papan yang didukung →

Shield

Papan tambahan yang terhubung ke OpenMV Cam — jaringan, kontrol motor, layar, dan lainnya.

Lihat semua shield →

Sensor

Modul kamera dan adapter sensor yang terhubung ke konektor board-to-board — visi berwarna, monokrom, termal, dan berbasis event.

Lihat semua sensor →

Sumber daya lainnya

Komunitas & tautan