لـ OpenMV الإصدار v5.0.0 · يستند إلى MicroPython v1.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 درجات حرية — إزاحة x/y/z ودوران x/y/z.
يُستخدم للمعايرة الروبوتية وعلامات الواقع المعزز والتحديد المكاني الداخلي.
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.

اضبط العتبات وفق الإضاءة — عطّل الكسب التلقائي والتوازن التلقائي للأبيض أولًا.
مرّر عتبات متعددة لتتبع ألوان متعددة في استدعاء واحد.
pixels_threshold يرشح الاكتشافات الصغيرة؛ merge=True يدمج الكتل المتداخلة.
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 نقطة مفتاحية لليد

نموذج MediaPipe Hand Landmarks من Google يضع 21 مفصلًا على كل يد مكتشفة — المعصم والمفاصل وأطراف الأصابع.

يُحمَّل من /rom/hand_landmarks_full_224.tflite — يعمل مستقلًا هنا دون كشف الكف المسبق.
يُرجع قائمة لكل يد — الفهرس 0 لليسرى والفهرس 1 لليمنى.
ml.utils.draw_skeleton يرسم جميع المفاصل الـ 21 والاتصالات بينها في استدعاء واحد.

جديد على OpenMV؟

ابدأ بالدرس التعليمي خطوة بخطوة — يغطي إعداد العتاد وبيئة التطوير والبرامج النصية الأساسية ونصائح لأول مشروع حقيقي.

المكتبات الأساسية

العتاد والكاميرات ومعالجة الصور والمصفوفات متعددة الأبعاد والتعلم الآلي وتعدد المهام والشبكات وخوادم الويب والبلوتوث — كل ذلك من MicroPython.

عرض جميع المكتبات →

استكشاف حسب اللوحة

اختر OpenMV Cam لعرض تخطيط الدبابيس والمواصفات والمرجع السريع الخاص باللوحة.

عرض جميع اللوحات المدعومة →

الدروع

لوحات إضافية تتصل بـ OpenMV Cam — الشبكات والتحكم في المحركات وشاشات العرض والمزيد.

عرض جميع الدروع →

المستشعرات

وحدات الكاميرا ومحولات الاستشعار التي تتصل بالموصل بين اللوحتين — رؤية ملونة وأحادية اللون وحرارية وقائمة على الأحداث.

عرض جميع المستشعرات →

المزيد من الموارد

المجتمع والروابط