class ImageIO – אובייקט ImageIO

המחלקה ImageIO מקליטה ומנגנת זרמים של פריימים מסוג Image בפורמט הדיסק המקורי של OpenMV. זרם בודד יכול להכיל פריימים הטרוגניים (פורמטי פיקסל / גדלים שונים) ומקליט עבור כל אחד את מרווח הזמן בין הפריימים, כך שהניגון משחזר את קצב הפריימים המקורי.

קיימים שני מאגרי אחסון:

  • זרם קובץ – פריימים נקראים מתוך / מצורפים לקובץ במערכת הקבצים. הקובץ מתחיל בכותרת קסם (magic header) באורך 16 בתים OMV IMG STR Vx.y ואחריה מקטעים לכל פריים. הכותב הנוכחי מפיק V2.0; קבצים ישנים יותר מסוג V1.0 ו-V1.1 עדיין ניתנים לקריאה.

  • זרם זיכרון – פריימים נקראים מתוך / נכתבים אל חוצץ RAM בגודל קבוע המוקצה בזמן הבנייה. שימושי למעבר הלוך-ושוב של פריימים דרך מסננים הזקוקים להקלטה מבלי לגעת במערכת הקבצים.

class image.ImageIO(path: str | Tuple[int, int, int], mode: str | int)

יצירת זרם ImageIO.

אם path הוא מחרוזת, נפתח זרם קובץ בנתיב זה. mode חייב להיות אחד מהבאים:

  • 'r' – פתיחת קובץ קיים לקריאה. כותרת הקסם מאומתת והגרסה (V1.0 / V1.1 / V2.0) נרשמת לשימוש על ידי version().

  • 'w' – קיצוץ / יצירת הקובץ וכתיבת כותרת קסם חדשה V2.0. פריימים מצורפים בכל write().

אם path הוא שלשה (3-tuple) (w, h, pixformat), מוקצה זרם זיכרון. mode הוא אז מספר משבצות הפריימים השלם שיש להקצות מראש. החוצץ מותאם לגודל של count פריימים בגודל (w, h, pixformat) ואינו רשאי לגדול לאחר היצירה. pixformat הוא אחד מ-image.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG, או image.PNG. עבור הפורמטים הדחוסים (image.JPEG, image.PNG) גודל כל משבצת מוערך ב-2 bpp; פריימים גדולים מההערכה מעלים ValueError בזמן write().

בדיקה

type() int

מחזיר את מאגר האחסון של הזרם: FILE_STREAM עבור זרם קובץ, MEMORY_STREAM עבור זרם זיכרון.

is_closed() bool

מחזיר True אם close() נקרא על אובייקט זה. לאחר הסגירה הזרם מעלה OSError("Stream closed") בכל פעולת קריאה/כתיבה/דילוג נוספת.

count() int

מחזיר את מספר הפריימים המאוחסנים כעת בזרם. עבור זרמי קובץ מספר זה גדל ככל ש-write() מצרף פריימים; עבור זרמי זיכרון הוא קבוע בזמן הבנייה.

offset() int

מחזיר את אינדקס הפריים הנוכחי. מוגדל על ידי read() ו-write(), מאופס על ידי seek().

version() int | None

מחזיר את גרסת פורמט הדיסק עבור זרמי קובץ (10 עבור V1.0, 11 עבור V1.1, 20 עבור V2.0). מחזיר None עבור זרמי זיכרון.

buffer_size() int | None

מחזיר את גודל חוצץ הפיקסלים לכל משבצת בבתים עבור זרמי זיכרון (גודל המשבצת פחות כותרת ניהול הרשומות הפנימית של Image). מחזיר None עבור זרמי קובץ. השתמש בזה יחד עם count() כדי לבדוק האם גודל פריים מסוים ייכנס.

size() int

מחזיר את סך הבתים שהזרם צורך – גודל הקובץ בדיסק עבור זרמי קובץ, או גודל חוצץ ה-RAM המלא (count * per_slot_size כולל כותרת כל משבצת) עבור זרמי זיכרון.

I/O

write(img: Image) ImageIO

מצרף (זרם קובץ) או מאחסן-בהיסט (זרם זיכרון) את img ומקדם את offset() באחד.

עבור זרמי קובץ הקובץ גדל ככל שפריימים מצורפים. כתיבה בהיסט שאינו הסוף מקצצת את שאר הקובץ כך שהמונה יכול להתכווץ.

עבור זרמי זיכרון הפריים נכתב לתוך המשבצת הנוכחית; כתיבה מעבר למשבצת האחרונה מעלה EOFError("End of stream") וכתיבת פריים גדול מ-buffer_size() מעלה ValueError("Invalid frame size").

מחזיר self כך שניתן לשרשר קריאות.

read(copy_to_fb: bool = True, *, loop: bool = True, pause: bool = True) Image | None

קורא את הפריים בהיסט הנוכחי offset(), מקדם את ההיסט, ומחזיר את ה-Image החדש. משקף את צד הניגון של write().

copy_to_fb – כאשר True (ברירת מחדל) הפריים המפוענח מוצב בחוצץ הפריימים של המצלמה (frame buffer) (אותו מקום שאליו מגיע csi.CSI.snapshot()), כך שניתן לצייר על ה-Image המוחזר דרך התצוגה המקדימה של ה-IDE. כאשר False הפריים מוקצה במקום זאת על ערימת ה-MicroPython.

loop (זרמי קובץ בלבד) – כאשר True (ברירת מחדל) קריאה מעבר לפריים האחרון מדלגת חזרה לפריים הראשון וממשיכה. כאשר False הקריאה מחזירה None ברגע שמגיעים לסוף הקובץ.

pause – כאשר True (ברירת מחדל) הקריאה חוסמת עד שמרווח הזמן בין הפריימים שהוקלט במקור חולף, כך שהניגון רץ בקצב הפריימים המקורי של ההקלטה. הגדר ל-False עבור ניגון מהיר ככל האפשר.

seek(offset: int) ImageIO

מעביר את offset() לפריים offset. offset חייב להיות לא-שלילי; היסטים של זרם זיכרון חייבים גם להיות קטנים מ-count().

דילוגים בזרם קובץ עוברים על הקובץ פריים אחר פריים מההתחלה מאחר ומקטעי הפריימים הם בגדלים משתנים – צפה לזמן O(offset) עבור קפיצות גדולות.

מחזיר self כך שניתן לשרשר קריאות.

sync() ImageIO

שוטף כתיבות ממתינות לדיסק עבור זרמי קובץ (קורא ל-sync הבסיסי של מערכת הקבצים). ללא פעולה עבור זרמי זיכרון.

מחזיר self כך שניתן לשרשר קריאות.

close() None

סוגר את הזרם. משחרר את חוצץ הזיכרון (זרמי זיכרון) או סוגר את הקובץ (זרמי קובץ). לאחר close() לא ניתן לעשות שימוש חוזר באובייקט ImageIO; פעולות עוקבות מעלות OSError("Stream closed"). קריאה ל-close() פעמיים אינה מבצעת דבר.

אובייקט ImageIO נסגר גם אוטומטית כאשר הוא נאסף על ידי אוסף הזבל (garbage-collected) (הוא רושם פעולת סיום בזמן הבנייה).

קבועים

FILE_STREAM: int

ערך המוחזר על ידי type() עבור זרמים מגובי קובץ.

MEMORY_STREAM: int

ערך המוחזר על ידי type() עבור זרמים בזיכרון.