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، فهي أسرع بكثير من استدعاء هذه المساعدات في حلقة.
الفئات¶
- class Image -- كائن الصورة
- class ImageIO -- كائن ImageIO
- class HaarCascade -- واصف الميزات
- class Similarity -- كائن Similarity
- class Histogram -- كائن Histogram
- class Percentile -- كائن Percentile
- class Threshold -- كائن العتبة
- class Statistics -- كائن Statistics
- class Blob -- كائن Blob
- class Line -- كائن Line
- class Circle -- كائن Circle
- class Rect -- كائن المستطيل
- class QRCode -- كائن QRCode
- class AprilTag -- كائن AprilTag
- class DataMatrix -- كائن DataMatrix
- class BarCode -- كائن BarCode
- class Displacement -- كائن Displacement
- class kptmatch -- كائن مطابقة النقاط المفتاحية
الدوال¶
مساعدات تحويل الفضاء اللوني¶
تؤدي كل دالة من دوال X_to_Y أدناه تحويلًا واحدًا لقيمة بكسل. وكلها تأخذ/تُرجع قيمًا ضمن نطاقات OpenMV القياسية:
binary --
int0 -- 1.grayscale --
int0 -- 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.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وأرجِعه. يحدد وسم النوع الداخلي للملف أي فئة واصف يُعاد بناؤها:واصف نقاط ORB المفتاحية -- مُحفوظ بواسطة
Image.find_keypoints()متبوعًا بـimage.save_descriptor().واصف LBP -- مُحفوظ بواسطة
Image.find_lbp()متبوعًا بـimage.save_descriptor().
- 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_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_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() أو طرق تغيير الحجم المماثلة.
تلميحات الرسم / draw_image¶
اجمع أيًا من هذه باستخدام Bit-OR ومرّرها كوسيط hint لـ Image.draw_image().
- 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¶
غيّر حجم المصدر ليملأ الوجهة مع الحفاظ على نسبة العرض إلى الارتفاع (يقتطع عند اختلاف النسب).
أخذ العينات الفرعي لـ JPEG¶
مرّر أيًا مما يلي كوسيط subsampling إلى Image.to_jpeg() أو Image.compress() أو Image.save() عند كتابة JPEG.
- image.JPEG_SUBSAMPLING_AUTO: int¶
اختر أخذ العينات الفرعي اللوني تلقائيًا بناءً على إعداد جودة JPEG.
مطابقة القوالب¶
مرّر أيًا مما يلي كوسيط search إلى Image.find_template().
كشف الحواف¶
مرّر أيًا مما يلي كوسيط algorithm إلى Image.find_edges().
- 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(). كل عائلة محكومة بخيار بناء خاص بها في البرنامج الثابت؛ والعائلات غير المدعومة تكون غائبة وقت التشغيل بدلًا من أن تكون دائمًا صفرًا.
رموز الباركود¶
القيم المُبلَّغ عنها في BarCode.type للإدخالات التي تُرجعها Image.find_barcodes().
- image.PDF417: int¶
باركود PDF417 ثنائي الأبعاد المكدّس. يوجد الثابت من أجل الاكتمال، لكن مفكّك تشفير الباركود لا يطبّق حاليًا PDF417 -- لن تُرجع
Image.find_barcodes()أي كشوفات من هذا النوع.