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() כדי ללכוד את הפריים הבא ישירות לתוך חוצץ הפריימים (frame buffer); ה-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 ישירות מהחיישן. שימושי לדה-מוזאיקה מותאמת אישית או לאחסון יותר פיקסלים בפחות זיכרון לפני דה-בייאר לפי דרישה.

  • 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 והחזר ידית Cascade לשימוש עם Image.find_features().

path יכול להיות אחד מ:

  • המחרוזת המילולית "frontalface" או "eye" כדי לטעון אחד משני ה-cascades המוטמעים ב-ROM של הקושחה, או

  • נתיב במערכת הקבצים לקובץ בינארי .cascade מותאם אישית שנוצר על ידי כלי ממיר ה-cascade של OpenMV.

stages בוחר כמה שלבי cascade להעריך בזמן הזיהוי. -1 משתמש בכל שלב המאוחסן בקובץ. הקטנת ערך זה מאיצה את הזיהוי במחיר של יותר זיהויי שווא.

image.load_descriptor(path: str) kp_desc | lbp_desc

טען מתאר (descriptor) מהקובץ בנתיב 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)

פונקציות עזר אלה מקבלות 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; השתמש בכך כשאתה רוצה לבצע דה-בייאר לפי דרישה או לאחסן יותר פיקסלים בפחות זיכרון.

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

חיפוש ממצה – מעריך כל מיקום באזור העניין (ROI). האיטי ביותר אך מובטח שימצא את ההתאמה הטובה ביותר.

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 מזהים ייחודיים, תיקון שגיאות של 0 ביט).

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.