class ImageIO -- ImageIO オブジェクト

ImageIO クラスは、OpenMV 独自のオンディスク形式で Image フレームのストリームを記録・再生します。1 つのストリームには異種のフレーム(異なるピクセル形式やサイズ)を保持でき、各フレームのフレーム間間隔も記録するため、再生時には元のフレームレートが再現されます。

バッキングストアには 2 種類があります。

  • ファイルストリーム -- フレームはファイルシステム上のファイルから読み込まれ、またはファイルへ追記されます。ファイルは 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() のたびに追記されます。

path3 要素タプル (w, h, pixformat) の場合、メモリストリームが確保されます。この場合 mode は事前に確保する フレームスロットの数(整数)です。バッファは (w, h, pixformat) のフレームを count 個格納できるサイズに確保され、作成後に 拡張することはできません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() を 1 つ進めます。

ファイルストリームでは、フレームが追記されるにつれてファイルが大きくなります。末尾以外のオフセットに書き込むと、ファイルの残りが切り詰められるため、フレーム数が減少することがあります。

メモリストリームでは、フレームは現在のスロットに書き込まれます。最後のスロットを超えて書き込もうとすると 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() をフレーム offset へ移動します。offset は非負でなければなりません。メモリストリームのオフセットはさらに count() 未満でなければなりません。

フレームチャンクは可変サイズのため、ファイルストリームのシークは先頭からフレームを 1 つずつたどります。大きくジャンプする場合は O(offset) の時間を見込んでください。

呼び出しを連鎖できるよう self を返します。

sync() ImageIO

ファイルストリームの保留中の書き込みをディスクへフラッシュします(基盤となるファイルシステムの sync を呼び出します)。メモリストリームでは何も行いません。

呼び出しを連鎖できるよう self を返します。

close() None

ストリームを閉じます。メモリバッファを解放(メモリストリーム)するか、ファイルを閉じます(ファイルストリーム)。close() 後は ImageIO オブジェクトを再利用できません。以降の操作は OSError("Stream closed") を発生させます。close() を 2 回呼び出しても何も起こりません。

ImageIO は、ガベージコレクションされたときにも自動的に閉じられます(構築時にファイナライザを登録します)。

定数

FILE_STREAM: int

ファイルバックのストリームに対して type() が返す値です。

MEMORY_STREAM: int

メモリ内ストリームに対して type() が返す値です。