עבור OpenMV גרסה 5.0.0 · מבוסס על MicroPython גרסה 1.28 · תיעוד נבנה 18 ביוני 2026

ראייה ממוחשבת,
פשוטה ונגישה.

זיהוי פנים בזמן אמת, מעקב AprilTag, סריקת QR ו-YOLO. הכל על המכשיר עצמו, ב-MicroPython טהור. ללא מחשב מארח, ללא ענן.

מה חדש קרא את יומן השינויים של OpenMV גרסה v5.0.0

שלום עולם

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

מעקב אנשים בזמן אמת

מודל YOLOv8 המובנה הוא גלאי אנשים חד-מחלקתי — כמות int8 ומאוחסן ב-ROM.

נטען מ-/rom/yolov8n_192.tflite — אין צורך בכרטיס SD או הורדה.
פועל בזמן אמת על לוחות עם NPU — ה-OpenMV N6 וה-AE3.
הבא מודל YOLOv8 משלך שאומן על Roboflow וטען אותו באותו אופן.
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")

אתר וזהה AprilTags

AprilTags הם סמנים פידוציאליים דו-מימדיים — עמידים לטשטוש תנועה וחסימה חלקית, ומספקים יציבה תלת-מימדית מלאה.

גלאי מובנה — אין צורך בקובץ מודל או אימון.
מחזיר מזהה ויציבה מלאה של 6-DoF — תזוזת x/y/z וסיבוב x/y/z.
מתאים לכיול רובוטיקה, סמני AR ומיקום פנים.
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")

זיהוי פנים עם BlazeFace

BlazeFace של Google הוא גלאי פנים קל-משקל ב-TensorFlow Lite המחזיר מלבני תיחום ושש נקודות ציון לכל פנים.

נטען מ-/rom/blazeface_front_128.tflite — מכומת מראש, אין צורך בהורדה.
שש נקודות מפתח לכל פנים: עיניים, אף, פה ואוזניים.
ללא חשש לפרטיות — הפריימים לעולם לא עוזבים את המצלמה.
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 מזרם חי

מפענח ה-QR המובנה מטפל בקודים מוטים, מעוותים וחסומים חלקית.

כל תוצאה חושפת גם גרסה, רמת ECC וקואורדינטות פינה.
מצבי נתונים: מספרי, אלפאנומרי, בינארי וקאנג'י.
מחזיר את המטען המפוענח כמחרוזת Python — מוכן לשימוש.
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")

מצא אזורי צבע

find_blobs מחזיר אזורי פיקסלים רצופים התואמים לסף LAB אחד או יותר.

כייל ספים להתאמת התאורה שלך — בטל קודם את auto-gain ו-auto-whitebal.
העבר מספר ספים למעקב רב-צבעוני בקריאה אחת.
pixels_threshold מסנן זיהויים קטנים; merge=True מאחד blobs חופפים.
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")

קרא ברקודים חד-ממדיים

מצא ברקודים חד-ממדיים בכל מקום בפריים ופענח את המידע שלהם.

מופעל על ידי ספריית ZBar — מזהה EAN, UPC, Code 39/93/128, Codabar, ITF, ISBN, ו-DataBar.
השתמש ברצועת חלון בגווני אפור לסריקה ליניארית מהירה ביותר.
כל תוצאה כוללת פורמט, מטען, סיבוב, פינות ומלבן תיחום.
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 נקודות מפתח של היד

מודל Hand Landmarks של Google MediaPipe ממקם 21 מפרקים על כל יד שזוהתה — שורש כף יד, פרקי אצבעות וקצות אצבעות.

נטען מ-/rom/hand_landmarks_full_224.tflite — פועל עצמאית כאן, ללא זיהוי כף יד במעלה הזרם.
מחזיר רשימה אחת לכל יד — אינדקס 0 הוא שמאל, אינדקס 1 הוא ימין.
ml.utils.draw_skeleton מצייר את כל 21 המפרקים וחיבוריהם בקריאה אחת.

חדש ב-OpenMV?

התחל עם המדריך השלב-אחר-שלב — הוא מכסה הגדרת חומרה, ה-IDE, סקריפטים בסיסיים וטיפים לפרויקט הראשון שלך.

ספריות ליבה

חומרה, מצלמות, עיבוד תמונה, ndarrays, ML, ריבוי משימות, רשת, שרתי אינטרנט ו-Bluetooth — הכל מ-MicroPython.

הצג את כל הספריות ←

גלה לפי לוח

בחר את OpenMV Cam שלך כדי לראות את מפת הפינים, המפרטים וסיכום מהיר ספציפי ללוח.

הצג את כל הלוחות הנתמכים ←

מגנים

לוחות תוספת המתחברים ל-OpenMV Cam — רשת, בקרת מנועים, תצוגות ועוד.

הצג את כל המגנים ←

חיישנים

מודולי מצלמה ומתאמי חיישן המתחברים לחיבור לוח-ללוח — ראייה צבעונית, מונוכרומטית, תרמית ומבוססת-אירועים.

הצג את כל החיישנים ←

משאבים נוספים

קהילה & קישורים