Dành cho OpenMV firmware v5.0.0 · dựa trên MicroPython v1.28 · tài liệu được xây dựng 18 tháng 6, 2026

Thị giác máy,
đơn giản hóa.

Phát hiện khuôn mặt trực tiếp, theo dõi AprilTag, quét QR và YOLO. Tất cả trên thiết bị bằng MicroPython thuần túy. Không cần máy tính chủ, không cần đám mây.

Có gì mới Đọc nhật ký thay đổi OpenMV firmware v5.0.0

Xin chào thế giới

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

Theo dõi người trong thời gian thực

Mô hình YOLOv8 tích hợp là bộ phát hiện người một lớp — lượng tử hóa int8 và được lưu trong ROM.

Được tải từ /rom/yolov8n_192.tflite — không cần thẻ SD hay tải xuống.
Chạy trong thời gian thực trên các bo mạch có NPU — OpenMV N6 và AE3.
Mang mô hình YOLOv8 của riêng bạn được huấn luyện trên Roboflow và tải theo cách tương tự.
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")

Xác định vị trí và nhận dạng AprilTag

AprilTag là các điểm đánh dấu 2D fiducial — chịu đựng được nhiễu chuyển động và che khuất một phần, đồng thời cung cấp tư thế 3D đầy đủ.

Bộ phát hiện tích hợp — không cần tệp mô hình (ML) hay huấn luyện.
Trả về ID cùng tư thế 6 bậc tự do đầy đủ — dịch chuyển x/y/z và xoay x/y/z.
Sử dụng cho hiệu chỉnh robot, điểm đánh dấu AR và định vị trong nhà.
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")

Phát hiện khuôn mặt với BlazeFace

BlazeFace của Google là bộ phát hiện khuôn mặt TensorFlow Lite nhẹ trả về hộp giới hạn cùng sáu điểm đặc trưng trên mỗi khuôn mặt.

Được tải từ /rom/blazeface_front_128.tflite — đã lượng tử hóa sẵn, không cần tải xuống.
Sáu điểm đặc trưng trên mỗi khuôn mặt: mắt, mũi, miệng và tai.
Không lo ngại về quyền riêng tư — khung hình không bao giờ rời camera.
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")

Quét mã QR từ nguồn cấp trực tiếp

Bộ giải mã QR tích hợp xử lý các mã bị nghiêng, biến dạng và che khuất một phần.

Mỗi kết quả còn cung cấp phiên bản, mức ECC và tọa độ góc.
Các chế độ dữ liệu số, chữ số, nhị phân và Kanji.
Trả về nội dung đã giải mã dưới dạng chuỗi Python — sẵn sàng để sử dụng.
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")

Tìm vùng màu (blob)

find_blobs trả về các vùng điểm ảnh liên kết khớp với một hoặc nhiều ngưỡng LAB.

Điều chỉnh ngưỡng cho điều kiện ánh sáng của bạn — tắt tự động độ khuếch đại và tự động cân bằng trắng trước.
Truyền nhiều ngưỡng để theo dõi đa màu sắc trong một lần gọi.
pixels_threshold lọc các phát hiện nhỏ; merge=True nối các vùng màu (blob) chồng lên nhau.
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")

Đọc mã vạch 1D

Tìm mã vạch 1D ở bất kỳ đâu trong khung hình và giải mã nội dung của chúng.

Được cung cấp bởi thư viện ZBar — nhận dạng EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN và DataBar.
Sử dụng dải cửa sổ theo thang xám để quét tuyến tính nhanh nhất.
Mỗi kết quả có định dạng, nội dung, góc quay, góc và hình chữ nhật giới hạn.
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")

Theo dõi 21 điểm đặc trưng bàn tay

Mô hình Hand Landmarks của Google MediaPipe đặt 21 khớp trên mỗi bàn tay được phát hiện — cổ tay, khớp ngón tay và đầu ngón tay.

Được tải từ /rom/hand_landmarks_full_224.tflite — chạy độc lập tại đây, không cần phát hiện lòng bàn tay ở trước.
Trả về một danh sách trên mỗi bàn tay — chỉ mục 0 là tay trái, chỉ mục 1 là tay phải.
ml.utils.draw_skeleton vẽ tất cả 21 khớp và kết nối trong một lần gọi.

Mới với OpenMV?

Bắt đầu với hướng dẫn từng bước — bao gồm thiết lập phần cứng, IDE, các tập lệnh cơ bản và mẹo cho dự án thực tế đầu tiên của bạn.

Thư viện cốt lõi

Phần cứng, camera, xử lý ảnh, ndarray, ML, đa nhiệm, mạng, máy chủ web và Bluetooth — tất cả từ MicroPython.

Xem tất cả thư viện →

Khám phá theo bo mạch

Chọn OpenMV Cam của bạn để xem sơ đồ chân, thông số kỹ thuật và tài liệu tham khảo nhanh theo bo mạch.

Xem tất cả bo mạch được hỗ trợ →

Shield

Các bo mạch mở rộng cắm vào OpenMV Cam — mạng, điều khiển động cơ, màn hình và nhiều hơn nữa.

Xem tất cả shield →

Cảm biến

Các mô-đun camera và bộ chuyển đổi cảm biến cắm vào đầu nối bo mạch — màu sắc, đơn sắc, nhiệt và thị giác dựa trên sự kiện.

Xem tất cả cảm biến →

Thêm tài nguyên

Cộng đồng & liên kết