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.