image --- الرؤية الآلية

تُعد وحدة image قلب حزمة الرؤية الآلية في OpenMV. فهي تعرض الفئة Image -- مخزن البكسل في الذاكرة الذي تعمل عليه كل روتينات الرسم والترشيح والتحويل واستخراج الميزات -- إلى جانب كائنات النتائج الداعمة التي تُرجعها تلك الروتينات (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, ...) والفئات المساعدة المستخدمة لتهيئتها (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

الحصول على صورة

هناك أربع طرق لإدخال Image إلى ذاكرة RAM:

  • التقاط مباشر من مستشعر الكاميرا. استدعِ csi.CSI.snapshot() لالتقاط الإطار التالي مباشرةً إلى مخزن الإطارات؛ تشير الصورة Image المُرجَعة إلى ذلك المخزن.

  • من ملف. مرّر مسارًا إلى مُنشئ Image (image.Image("/sd/photo.jpg"))؛ التنسيقات المدعومة على القرص هي BMP وPPM/PGM وJPEG وPNG وتنسيق التسجيل ImageIO الخاص بـ OpenMV.

  • من ndarray. مرّر ndarray من نوع float32 بأبعاد (h, w) أو (h, w, 3) إلى مُنشئ Image. تُحوَّل البكسلات من 0.0 -- 255.0 إلى صورة GRAYSCALE أو RGB565 على التوالي. استخدم هذا لإعادة خرج المُوتِّر من ml (أو أي خط معالجة في ulab) إلى صورة قابلة للرسم.

  • مخزن فارغ. أنشئ Image بحجم وتنسيق بكسل محددين (image.Image(320, 240, image.RGB565)) للرسم فيها من الصفر، أو لاستخدامها كسطح مؤقت لعمليات حساب الصور.

تنسيقات البكسل

تمتلك كل Image أحد تنسيقات البكسل التالية؛ ويوازن الاختيار بين الذاكرة وتكلفة المعالجة والخوارزميات التي يمكن تشغيلها عليها. استخدم BINARY أو GRAYSCALE أو RGB565 أو BAYER أو YUV422 أو JPEG أو PNG كوسيط pixformat عند إنشاء صورة أو تهيئة مستشعر الكاميرا:

  • BINARY (1 bpp) -- بت واحد لكل بكسل. أصغر تنسيق؛ يُستخدم داخليًا في روتينات تحديد العتبة والمورفولوجيا لكنه نادرًا ما يُلتقط مباشرة من المستشعر.

  • GRAYSCALE (8 bpp) -- بايت واحد لكل بكسل (قناة Y من YUV422). أسرع تنسيق لمعظم خوارزميات الرؤية الحاسوبية (AprilTag وكشف الحواف والتدفق البصري).

  • RGB565 (16 bpp) -- بايتان لكل بكسل، 5 بتات للأحمر / 6 بتات للأخضر / 5 بتات للأزرق. تنسيق اللون الافتراضي.

  • BAYER (8 bpp) -- بيانات لون نمط Bayer الخام مباشرةً من المستشعر. مفيد لإزالة التشابك (de-mosaicing) المخصصة أو لتخزين بكسلات أكثر في ذاكرة أقل قبل تطبيق debayering عند الطلب.

  • YUV422 (16 bpp) -- لون بدقة لونية مخفّضة 4:2:2، بايتان لكل بكسل. مفيد عندما تريد خوارزميات خاصة باللونية دون تحمل التكلفة الكاملة لـ RGB.

  • JPEG / PNG -- مخازن مضغوطة. الأفضل للتخزين والإرسال عبر الشبكة. تتطلب العمليات على مستوى البكسل استخدام Image.to_grayscale() أو Image.to_rgb565() أولًا.

العمل مع النتائج

تُرجع طرق الكشف / استخراج الميزات في Image كائنات يمكنك التكرار عليها ودمجها -- فاستدعاء Image.find_blobs() يُرجع قائمة من Blob، واستدعاء Image.find_apriltags() يُرجع قائمة من AprilTag، وهكذا. تعرض كل فئة نتيجة الخصائص الهندسية للكشف (المركز ومربع الإحاطة والمساحة وقيمة الرمز، إلخ) لتتمكن من التعامل معها مباشرةً أو تمريرها إلى طرق الرسم (Image.draw_rectangle(), Image.draw_string(), ...).

مساعدات الفضاء اللوني

تعرض الوحدة أيضًا دوالًا نقية صغيرة لتحويل قيم البكسل الفردية بين الفضاءات اللونية binary / grayscale / RGB / LAB / YUV. وهي مفيدة عندما تحتاج إلى تحويل قيم العتبة أو إدخالات لوحة الألوان في Python قبل تمريرها إلى عمليات الصور -- أما لتحويل الصورة كاملةً فاستخدم طرق to_* في Image، فهي أسرع بكثير من استدعاء هذه المساعدات في حلقة.

الفئات

الدوال

مساعدات تحويل الفضاء اللوني

تؤدي كل دالة من دوال X_to_Y أدناه تحويلًا واحدًا لقيمة بكسل. وكلها تأخذ/تُرجع قيمًا ضمن نطاقات OpenMV القياسية:

  • binary -- int 0 -- 1.

  • grayscale -- int 0 -- 255.

  • RGB -- صفّ (r, g, b) من أعداد صحيحة بطول 8 بتات (كل منها 0 -- 255).

  • LAB -- صفّ (l, a, b) حيث L في النطاق 0 -- 100 و A/B في النطاق -128 -- 127.

  • YUV -- صفّ (y, u, v) حيث Y في النطاق 0 -- 255 و U/V في النطاق -128 -- 127.

لتحويل الصورة كاملةً استخدم طرق to_* في Image، فهي أسرع بكثير من استدعاء هذه المساعدات في حلقة.

image.binary_to_grayscale(value: int) int

تحويل قيمة binary إلى قيمة grayscale.

image.binary_to_rgb(value: int) Tuple[int, int, int]

تحويل قيمة binary إلى صفّ RGB.

image.binary_to_lab(value: int) Tuple[int, int, int]

تحويل قيمة binary إلى صفّ LAB.

image.binary_to_yuv(value: int) Tuple[int, int, int]

تحويل قيمة binary إلى صفّ YUV.

image.grayscale_to_binary(value: int) int

تحويل قيمة grayscale إلى قيمة binary.

image.grayscale_to_rgb(value: int) Tuple[int, int, int]

تحويل قيمة grayscale إلى صفّ RGB.

image.grayscale_to_lab(value: int) Tuple[int, int, int]

تحويل قيمة grayscale إلى صفّ LAB.

image.grayscale_to_yuv(value: int) Tuple[int, int, int]

تحويل قيمة grayscale إلى صفّ YUV.

image.rgb_to_binary(value: Tuple[int, int, int]) int

تحويل صفّ RGB إلى قيمة binary.

image.rgb_to_grayscale(value: Tuple[int, int, int]) int

تحويل صفّ RGB إلى قيمة grayscale.

image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]

تحويل صفّ RGB إلى صفّ LAB.

image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]

تحويل صفّ RGB إلى صفّ YUV.

image.lab_to_binary(value: Tuple[int, int, int]) int

تحويل صفّ LAB إلى قيمة binary.

image.lab_to_grayscale(value: Tuple[int, int, int]) int

تحويل صفّ LAB إلى قيمة grayscale.

image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]

تحويل صفّ LAB إلى صفّ RGB.

image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]

تحويل صفّ LAB إلى صفّ YUV.

image.yuv_to_binary(value: Tuple[int, int, int]) int

تحويل صفّ YUV إلى قيمة binary.

image.yuv_to_grayscale(value: Tuple[int, int, int]) int

تحويل صفّ YUV إلى قيمة grayscale.

image.yuv_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]

تحويل صفّ YUV إلى صفّ RGB.

image.yuv_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]

تحويل صفّ YUV إلى صفّ LAB.

واصفات الميزات

image.HaarCascade(path: str, stages: int = -1) Cascade

حمّل تتالي Haar وأرجِع مقبض Cascade للاستخدام مع Image.find_features().

قد يكون path إما:

  • السلسلة الحرفية "frontalface" أو "eye" لتحميل أحد التتاليَين المُضمّنين في ذاكرة ROM للبرنامج الثابت، أو

  • مسار نظام ملفات إلى ملف ثنائي .cascade مخصص أنتجته أدوات محوّل التتالي في OpenMV.

يحدد stages عدد مراحل التتالي التي يجب تقييمها وقت الكشف. يستخدم -1 كل مرحلة مخزَّنة في الملف. خفض هذه القيمة يسرّع الكشف على حساب مزيد من النتائج الإيجابية الخاطئة.

image.load_descriptor(path: str) kp_desc | lbp_desc

حمّل واصفًا من الملف الموجود في path وأرجِعه. يحدد وسم النوع الداخلي للملف أي فئة واصف يُعاد بناؤها:

image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None

تسلسل descriptor (واصف نقطة مفتاحية ORB أو واصف LBP) إلى الملف الموجود في path بتنسيق ملف واصف OpenMV. ويمكن إعادة تحميل الملف نفسه لاحقًا عبر image.load_descriptor().

image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch

مطابقة واصفَين من النوع نفسه.

  • بالنسبة لواصفَي LBP -- يُرجع مسافة Hamming الصحيحة بينهما (القيمة الأقل تعني تطابقًا أقرب).

  • بالنسبة لواصفَي نقاط ORB المفتاحية -- يُرجع kptmatch يصف عنقود النقاط المفتاحية المتطابقة، أو None إذا لم يتجاوز أي تطابق قيمة threshold.

يحدد threshold (0 -- 100) مدى صرامة مطابقة ORB عند قبول زوج من النقاط المفتاحية. القيم الأقل تشدّد المطابقة برفض تطابقات الجار الأقرب الضعيفة.

يفعّل filter_outliers رفض القيم الشاذة بأسلوب RANSAC عبر مجموعة النقاط المفتاحية المتطابقة. استخدمه عندما تتوقع تحويلًا صلبًا واحدًا بين العرضَين؛ وعطّله عندما تمتد النقاط المفتاحية المتطابقة عبر عدة أجسام.

مساعدات هندسة الكتلة

تأخذ هذه المساعدات Blob (كما تُرجعه Image.find_blobs()) وتحسب خصائص هندسية إضافية عند الطلب. وهي موجودة على نطاق الوحدة -- وليس على Blob -- لذا لا يتحمل مسار find_blobs() الأساسي تكلفتها ما لم تطلبها.

image.get_solidity(blob: blob) float

أرجِع الصلابة (blob.pixels / convex_hull_area) لـ blob. عدد عشري، 0 -- 1؛ القيمة 1.0 تعني أن الكتلة تملأ غلافها المحدّب بالكامل.

image.get_convexity(blob: blob) float

أرجِع التحدب (convex_hull_perimeter / blob.perimeter) لـ blob. عدد عشري، 0 -- 1؛ القيمة 1.0 تعني كتلة محدّبة تمامًا.

image.get_major_axis_line(blob: blob) line

أرجِع Line على طول المحور الرئيسي لـ blob (الأطول من المحورَين الأساسيَين للمستطيل المدوّر ذي المساحة الدنيا).

image.get_minor_axis_line(blob: blob) line

أرجِع Line على طول المحور الثانوي لـ blob (الأقصر من المحورَين الأساسيَين للمستطيل المدوّر ذي المساحة الدنيا).

image.get_enclosing_circle(blob: blob) circle

أرجِع Circle يُحيط بـ blob.

image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]

أرجِع صفًّا من 5 عناصر (cx, cy, a, b, rotation) يصف القطع الناقص المرسوم داخل المستطيل المدوّر ذي المساحة الدنيا حول blob:

  • cx / cy -- مركز القطع الناقص بالبكسل (عدد صحيح).

  • a / b -- أطوال أنصاف المحاور بالبكسل (عدد صحيح).

  • rotation -- دوران القطع الناقص بالدرجات (عدد صحيح).

هذا صفّ عادي وليس attrtuple، لذا يمكن الوصول إلى الحقول بالفهرس فقط.

الثوابت

تنسيقات البكسل

مرّر أيًا مما يلي كوسيط pixformat إلى مُنشئ Image أو إلى csi.CSI.pixformat().

image.BINARY: int

خريطة بت بمعدل بت واحد لكل بكسل. أصغر تنسيق -- يُستخدم داخليًا في تحديد العتبة والمورفولوجيا، ونادرًا ما يُلتقط مباشرةً من مستشعر.

image.GRAYSCALE: int

تدرج رمادي بمعدل 8 بتات لكل بكسل (بايت واحد لكل بكسل). أسرع تنسيق لمعظم خوارزميات الرؤية الحاسوبية (AprilTag وكشف الحواف والتدفق البصري).

image.RGB565: int

لون بمعدل 16 بت لكل بكسل مُحزَّم كـ 5 بتات للأحمر / 6 بتات للأخضر / 5 بتات للأزرق. تنسيق اللون الافتراضي.

image.BAYER: int

بيانات Bayer خام بمعدل 8 بتات لكل بكسل مباشرةً من المستشعر. معظم طرق معالجة الصور غير متاحة على صور Bayer؛ استخدم هذا عندما تريد تطبيق debayer عند الطلب أو تخزين بكسلات أكثر في ذاكرة أقل.

image.YUV422: int

لون بدقة لونية مخفّضة 4:2:2، بايتان لكل بكسل، مُحزَّم كـ Y1, U, Y2, V لكل زوج بكسل. تعمل بعض طرق معالجة الصور فقط مباشرةً على YUV422.

image.JPEG: int

مخزن JPEG مضغوط. تتطلب العمليات على مستوى البكسل استخدام Image.to_grayscale() أو Image.to_rgb565() أولًا.

image.PNG: int

مخزن PNG مضغوط. تتطلب العمليات على مستوى البكسل استخدام Image.to_grayscale() أو Image.to_rgb565() أولًا.

لوحات الألوان

مرّر أيًا مما يلي إلى Image.to_rainbow() أو Image.to_ironbow() أو Image.draw_image() (color_palette=) أو إلى csi.CSI.color_palette() لتلوين صورة تدرج رمادي.

image.PALETTE_RAINBOW: int

عجلة ألوان قوس قزح ناعمة. لوحة OpenMV الافتراضية للصور الحرارية.

image.PALETTE_IRONBOW: int

لوحة "ironbow" غير الخطية التي تحاكي مظهر عدسة العرض الحرارية FLIR Lepton.

image.PALETTE_DEPTH: int

لوحة صورة العمق. متاحة فقط في الإصدارات التي تدعم مستشعر العمق (خط معالجة ToF -- مثل OpenMV Cam AE3 أو أي كاميرا مزودة بوحدة ToF Pmod).

image.PALETTE_EVT_DARK: int

لوحة لعرض إطارات كاميرا الأحداث GENX320 على خلفية داكنة. مرّرها إلى csi.CSI.color_palette لجعل برنامج تشغيل GENX320 يصدر إطارات RGB565 ملوّنة في وضع المدرج التكراري، أو إلى Image.draw_image() color_palette= عند تلوين صورة حدث بتدرج رمادي.

متاحة فقط في الإصدارات التي تدعم GENX320 (OpenMV Cam AE3 ووحدة GENX320 Pmod).

image.PALETTE_EVT_LIGHT: int

لوحة لعرض إطارات كاميرا الأحداث GENX320 على خلفية فاتحة. تتبع نفس آلية التوزيع والتوفر مثل PALETTE_EVT_DARK.

أوضاع تغيير الحجم

مرّر أيًا مما يلي كوسيط hint إلى Image.draw_image() أو Image.scale() أو طرق تغيير الحجم المماثلة.

image.AREA: int

أداة تغيير حجم بمتوسط المساحة. تُستخدم عند التصغير؛ بينما يُستخدم Nearest-Neighbor للتكبير.

image.BILINEAR: int

أداة تغيير حجم ثنائية الخطية. تُجري أخذ عينات فرعي عند التصغير.

image.BICUBIC: int

أداة تغيير حجم ثنائية التكعيب. جودة أعلى من BILINEAR لكنها أبطأ. تُجري أخذ عينات فرعي عند التصغير.

تلميحات الرسم / draw_image

اجمع أيًا من هذه باستخدام Bit-OR ومرّرها كوسيط hint لـ Image.draw_image().

image.VFLIP: int

اقلب المصدر رأسيًا أثناء الرسم.

image.HMIRROR: int

اعكس المصدر أفقيًا أثناء الرسم.

image.TRANSPOSE: int

بدّل (تبديل x/y) المصدر أثناء الرسم.

image.CENTER: int

وسّط المصدر على الوجهة. عندها تصبح أي إزاحات x/y صريحة إزاحات من المركز بدلًا من الزاوية العلوية اليسرى.

image.EXTRACT_RGB_CHANNEL_FIRST: int

عند استخراج قناة RGB عبر Image.draw_image()، استخرج القناة قبل تغيير الحجم. بدون هذا التلميح، تُستخرج القناة بعد تغيير الحجم.

image.APPLY_COLOR_PALETTE_FIRST: int

عند تطبيق لوحة ألوان عبر Image.draw_image()، طبّق اللوحة قبل تغيير الحجم. بدون هذا التلميح، تُطبَّق اللوحة بعد تغيير الحجم.

image.SCALE_ASPECT_KEEP: int

غيّر حجم المصدر ليناسب داخل الوجهة مع الحفاظ على نسبة العرض إلى الارتفاع (يُضيف أشرطة سوداء عند اختلاف النسب).

image.SCALE_ASPECT_EXPAND: int

غيّر حجم المصدر ليملأ الوجهة مع الحفاظ على نسبة العرض إلى الارتفاع (يقتطع عند اختلاف النسب).

image.SCALE_ASPECT_IGNORE: int

غيّر حجم المصدر ليملأ الوجهة، متجاهلًا نسبة العرض إلى الارتفاع.

image.BLACK_BACKGROUND: int

أخبر مسار مزج ألفا أن الوجهة معروفة بأنها سوداء حتى يتمكن من تخطي قراءة بكسل الوجهة. يسرّع تأثيرات ألفا على المخازن التي مُسحت حديثًا.

image.ROTATE_90: int

اختصار لـ VFLIP | TRANSPOSE (تدوير 90 درجة في اتجاه عقارب الساعة).

image.ROTATE_180: int

اختصار لـ HMIRROR | VFLIP (تدوير 180 درجة).

image.ROTATE_270: int

اختصار لـ HMIRROR | TRANSPOSE (تدوير 270 درجة في اتجاه عقارب الساعة).

أخذ العينات الفرعي لـ JPEG

مرّر أيًا مما يلي كوسيط subsampling إلى Image.to_jpeg() أو Image.compress() أو Image.save() عند كتابة JPEG.

image.JPEG_SUBSAMPLING_AUTO: int

اختر أخذ العينات الفرعي اللوني تلقائيًا بناءً على إعداد جودة JPEG.

image.JPEG_SUBSAMPLING_444: int

افرض أخذ عينات فرعي لوني 4:4:4 (دون ضغط لوني).

image.JPEG_SUBSAMPLING_422: int

افرض أخذ عينات فرعي لوني 4:2:2. يُوصى به عند بث MJPEG إلى مشغلات الفيديو الخارجية التي تسيء التعامل مع 4:2:0.

image.JPEG_SUBSAMPLING_420: int

افرض أخذ عينات فرعي لوني 4:2:0.

مطابقة القوالب

مرّر أيًا مما يلي كوسيط search إلى Image.find_template().

image.SEARCH_EX: int

بحث شامل -- يقيّم كل موضع في منطقة الاهتمام. الأبطأ لكنه يضمن إيجاد أفضل تطابق.

image.SEARCH_DS: int

بحث الماس -- بحث من الخشن إلى الدقيق أسرع بكثير من SEARCH_EX لكنه قد يفوّت الأمثل العام في القوالب شديدة التشابه الذاتي.

كشف الحواف

مرّر أيًا مما يلي كوسيط algorithm إلى Image.find_edges().

image.EDGE_CANNY: int

كاشف حواف Canny -- مقدار التدرج + قمع غير الأقصى + التباطؤ. جودة أعلى، أبطأ.

image.EDGE_SIMPLE: int

كاشف حواف بمرشح تمرير عالٍ مع عتبة. أسرع لكنه ينتج حوافًا أعرض وأكثر ضوضاءً من EDGE_CANNY.

كواشف زوايا ORB

مرّر أيًا مما يلي كوسيط corner_detector إلى Image.find_keypoints().

image.CORNER_FAST: int

كاشف زوايا FAST. أسرع من CORNER_AGAST لكنه أقل دقة.

image.CORNER_AGAST: int

كاشف زوايا AGAST. أبطأ من CORNER_FAST لكنه ينتج نقاطًا مفتاحية أكثر استقرارًا.

عائلات AprilTag

اجمع أي توليفة مما يلي باستخدام Bit-OR ومرّرها كوسيط families إلى Image.find_apriltags(). كل عائلة محكومة بخيار بناء خاص بها في البرنامج الثابت؛ والعائلات غير المدعومة تكون غائبة وقت التشغيل بدلًا من أن تكون دائمًا صفرًا.

image.TAG16H5: int

عائلة AprilTag 16h5 (30 معرّفًا فريدًا، تصحيح خطأ بصفر بت).

image.TAG25H9: int

عائلة AprilTag 25h9 (35 معرّفًا فريدًا، تصحيح خطأ حتى 3 بتات).

image.TAG36H10: int

عائلة AprilTag 36h10 (2320 معرّفًا فريدًا، تصحيح خطأ حتى 3 بتات).

image.TAG36H11: int

عائلة AprilTag 36h11 (587 معرّفًا فريدًا، تصحيح خطأ حتى 4 بتات). العائلة الأكثر شيوعًا.

image.TAGCIRCLE21H7: int

عائلة AprilTag Circle21h7.

image.TAGCIRCLE49H12: int

عائلة AprilTag Circle49h12.

image.TAGCUSTOM48H12: int

عائلة AprilTag Custom48h12.

image.TAGSTANDARD41H12: int

عائلة AprilTag Standard41h12.

image.TAGSTANDARD52H13: int

عائلة AprilTag Standard52h13.

رموز الباركود

القيم المُبلَّغ عنها في BarCode.type للإدخالات التي تُرجعها Image.find_barcodes().

image.EAN2: int

باركود EAN-2 التكميلي.

image.EAN5: int

باركود EAN-5 التكميلي.

image.EAN8: int

باركود EAN-8.

image.UPCE: int

باركود UPC-E.

image.ISBN10: int

باركود ISBN-10.

image.UPCA: int

باركود UPC-A.

image.EAN13: int

باركود EAN-13.

image.ISBN13: int

باركود ISBN-13.

image.I25: int

باركود Interleaved 2-of-5.

image.DATABAR: int

باركود GS1 DataBar.

image.DATABAR_EXP: int

باركود GS1 DataBar Expanded.

image.CODABAR: int

باركود Codabar.

image.CODE39: int

باركود Code 39.

image.PDF417: int

باركود PDF417 ثنائي الأبعاد المكدّس. يوجد الثابت من أجل الاكتمال، لكن مفكّك تشفير الباركود لا يطبّق حاليًا PDF417 -- لن تُرجع Image.find_barcodes() أي كشوفات من هذا النوع.

image.CODE93: int

باركود Code 93.

image.CODE128: int

باركود Code 128.