class ImageIO -- ImageIO 物件

ImageIO 類別以 OpenMV 的原生磁碟格式錄製及播放 Image 影格串流。單一串流可容納異質的影格(不同的像素格式/大小),並記錄每一影格之間的時間間隔,因此播放時能重現原始的影格率。

有兩種後端儲存方式:

  • 檔案串流 -- 影格從檔案系統上的檔案讀取/附加至該檔案。檔案開頭為 16 位元組的魔術標頭 OMV IMG STR Vx.y,後接逐影格的資料區塊。目前的寫入器產生 V2.0;較舊的 V1.0V1.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() 時會附加影格。

path3元組 (w, h, pixformat),則配置記憶體串流。此時 mode 為要預先配置的影格槽數量整數。緩衝區大小依 count(w, h, pixformat) 影格計算,建立後不允許增長pixformatimage.BINARYimage.GRAYSCALEimage.RGB565image.BAYERimage.YUV422image.JPEGimage.PNG 其中之一。對於壓縮格式(image.JPEGimage.PNG),每個槽的大小以 2 bpp 估算;超過估算值的影格會在 write() 時引發 ValueError

檢視

type() int

回傳串流的後端儲存方式:檔案串流為 FILE_STREAM,記憶體串流為 MEMORY_STREAM

is_closed() bool

若此物件已呼叫過 close(),則回傳 True。一旦關閉,串流在任何後續的讀取/寫入/搜尋時都會引發 OSError("Stream closed")

count() int

回傳目前串流中儲存的影格數量。對檔案串流而言,此值會隨著 write() 附加影格而增長;對記憶體串流而言,此值在建構時即已固定。

offset() int

回傳目前的影格索引。由 read()write() 遞增,並由 seek() 重設。

version() int | None

回傳檔案串流的磁碟格式版本(V1.010V1.111V2.020)。對記憶體串流則回傳 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(預設值)時,解碼後的影格會放入相機影格緩衝區(與 csi.CSI.snapshot() 影像落腳的位置相同),因此回傳的 Image 可透過 IDE 預覽繪製。當為 False 時,影格改為配置在 MicroPython 堆積上。

loop(僅限檔案串流)-- 當為 True(預設值)時,讀取超過最後一個影格會搜尋回第一個影格並繼續。當為 False 時,一旦到達檔案結尾,呼叫會回傳 None

pause -- 當為 True(預設值)時,呼叫會封鎖直到原始錄製的影格間隔時間流逝為止,因此播放會以錄製的原生影格率執行。設為 False 可進行盡可能快速的播放。

seek(offset: int) ImageIO

offset() 移至影格 offsetoffset 必須為非負數;記憶體串流的偏移還必須小於 count()

由於影格區塊大小不固定,檔案串流的搜尋會從頭逐一影格走訪檔案 -- 大幅跳躍時預期為 O(offset) 時間。

回傳 self,因此呼叫可串接。

sync() ImageIO

對檔案串流而言,將待寫入的資料清空(flush)至磁碟(呼叫底層檔案系統的 sync)。對記憶體串流則無作用。

回傳 self,因此呼叫可串接。

close() None

關閉串流。釋放記憶體緩衝區(記憶體串流)或關閉檔案(檔案串流)。在 close() 之後,ImageIO 物件無法再使用;後續操作會引發 OSError("Stream closed")。呼叫 close() 兩次則無作用。

ImageIO 在被垃圾回收時也會自動關閉(它在建構時註冊了一個終結器)。

常數

FILE_STREAM: int

type() 對於以檔案為後端的串流所回傳的值。

MEMORY_STREAM: int

type() 對於記憶體中串流所回傳的值。