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.