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, שהן מהירות בהרבה מקריאה לפונקציות העזר הללו בלולאה.
מחלקות¶
- class Image – אובייקט תמונה
- class ImageIO – אובייקט ImageIO
- class HaarCascade – מתאר מאפיינים
- class Similarity – אובייקט Similarity
- class Histogram – אובייקט Histogram
- class Percentile – אובייקט Percentile
- class Threshold – אובייקט 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 והחזר ידית
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והחזר אותו. תג הסוג הפנימי של הקובץ בוחר איזו מחלקת מתאר תשוחזר:מתאר נקודות מפתח 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)¶
פונקציות עזר אלה מקבלות 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; השתמש בכך כשאתה רוצה לבצע דה-בייאר לפי דרישה או לאחסן יותר פיקסלים בפחות זיכרון.
- 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¶
שנה את קנה המידה של המקור כך שימלא את היעד תוך שמירה על יחס הגובה-רוחב (חותך כשהיחסים שונים).
- image.SCALE_ASPECT_IGNORE: int¶
שנה את קנה המידה של המקור כך שימלא את היעד, תוך התעלמות מיחס הגובה-רוחב.
תת-דגימת JPEG¶
העבר כל אחד מהבאים כארגומנט ה-subsampling ל-Image.to_jpeg(), Image.compress() או Image.save() בעת כתיבת JPEG.
התאמת תבנית¶
העבר אחד מהבאים כארגומנט ה-search ל-Image.find_template().
זיהוי קצוות¶
העבר אחד מהבאים כארגומנט ה-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(). כל משפחה מותנית באפשרות בילד משלה בקושחה; משפחות שאינן נתמכות נעדרות בזמן ריצה במקום להיות תמיד-אפס.
סימבולוגיות ברקוד¶
הערכים המדווחים ב-BarCode.type עבור רשומות שמוחזרות על ידי Image.find_barcodes().
- image.PDF417: int¶
ברקוד דו-ממדי מוערם PDF417. הקבוע קיים לשם שלמות, אך מפענח הברקוד אינו מיישם כיום את PDF417 –
Image.find_barcodes()לא יחזיר זיהויים מסוג זה.