třída ImageIO – objekt ImageIO

Třída ImageIO zaznamenává a přehrává streamy snímků Image v nativním diskovém formátu OpenMV. Jeden stream může obsahovat heterogenní snímky (různé pixelové formáty / velikosti) a pro každý z nich zaznamenává interval mezi snímky, takže přehrávání obnoví původní snímkovou frekvenci.

Existují dva typy úložiště:

  • Souborový stream – snímky se čtou ze souboru na souborovém systému, případně se k němu připojují. Soubor začíná 16bajtovou magickou hlavičkou OMV IMG STR Vx.y následovanou bloky jednotlivých snímků. Aktuální zapisovač generuje V2.0; starší soubory V1.0 a V1.1 jsou stále čitelné.

  • Paměťový stream – snímky se čtou z RAM bufferu pevné velikosti alokovaného při vytvoření, případně se do něj zapisují. Užitečné pro průchod snímků filtry, které potřebují záznam, bez zásahu do souborového systému.

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

Vytvoří stream ImageIO.

Pokud je path řetězec, otevře se souborový stream na dané cestě. mode musí být jedna z hodnot:

  • 'r' – otevře existující soubor pro čtení. Magická hlavička se ověří a verze (V1.0 / V1.1 / V2.0) se zaznamená pro použití metodou version().

  • 'w' – zkrátí / vytvoří soubor a zapíše novou magickou hlavičku V2.0. Snímky se připojují při každém volání write().

Pokud je path 3prvková n-tice (w, h, pixformat), alokuje se paměťový stream. mode je pak celé číslo udávající počet slotů pro snímky, které se mají předalokovat. Buffer je dimenzován pro count snímků o rozměrech (w, h, pixformat) a po vytvoření se nesmí zvětšovat. pixformat je jedna z hodnot image.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG nebo image.PNG. U komprimovaných formátů (image.JPEG, image.PNG) se velikost jednoho slotu odhaduje na 2 bpp; snímky větší než tento odhad vyvolají při volání write() výjimku ValueError.

Zjišťování informací

type() int

Vrátí typ úložiště streamu: FILE_STREAM pro souborový stream, MEMORY_STREAM pro paměťový stream.

is_closed() bool

Vrátí True, pokud byla na tomto objektu zavolána metoda close(). Po uzavření vyvolá stream při jakékoli další operaci čtení/zápisu/posunu výjimku OSError("Stream closed").

count() int

Vrátí počet snímků aktuálně uložených ve streamu. U souborových streamů tento počet roste, jak write() připojuje snímky; u paměťových streamů je pevně dán při vytvoření.

offset() int

Vrátí aktuální index snímku. Zvyšuje se voláním read() a write(), resetuje se voláním seek().

version() int | None

Vrátí verzi diskového formátu pro souborové streamy (10 pro V1.0, 11 pro V1.1, 20 pro V2.0). Pro paměťové streamy vrátí None.

buffer_size() int | None

Vrátí velikost pixelového bufferu jednoho slotu v bajtech pro paměťové streamy (velikost slotu mínus interní evidenční hlavička Image). Pro souborové streamy vrátí None. Použijte ji společně s count() pro ověření, zda se konkrétní velikost snímku vejde.

size() int

Vrátí celkový počet bajtů, které stream spotřebovává – velikost souboru na disku pro souborové streamy, nebo celou velikost RAM bufferu (count * per_slot_size včetně hlavičky jednotlivých slotů) pro paměťové streamy.

Vstup/výstup

write(img: Image) ImageIO

Připojí (souborový stream) nebo uloží na pozici (paměťový stream) img a posune offset() o jedna.

U souborových streamů soubor roste, jak se snímky připojují. Zápis na pozici, která není koncem, zkrátí zbytek souboru, takže počet může klesnout.

U paměťových streamů se snímek zapíše do aktuálního slotu; zápis za poslední slot vyvolá EOFError("End of stream") a zápis snímku většího než buffer_size() vyvolá ValueError("Invalid frame size").

Vrátí self, takže lze volání řetězit.

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

Přečte snímek na aktuální pozici offset(), posune pozici a vrátí nový Image. Zrcadlí přehrávací polovinu metody write().

copy_to_fb – když je True (výchozí), umístí se dekódovaný snímek do snímkového bufferu (frame buffer) kamery (na stejné místo, kam přistává csi.CSI.snapshot()), takže vrácený Image je možné vykreslit v náhledu IDE. Když je False, snímek se místo toho alokuje na haldě MicroPythonu.

loop (pouze souborové streamy) – když je True (výchozí), čtení za poslední snímek se vrátí na první snímek a pokračuje. Když je False, volání po dosažení konce souboru vrátí None.

pause – když je True (výchozí), volání blokuje, dokud neuplyne původně zaznamenaný interval mezi snímky, takže přehrávání běží nativní snímkovou frekvencí záznamu. Nastavte na False pro co nejrychlejší možné přehrávání.

seek(offset: int) ImageIO

Přesune offset() na snímek offset. offset musí být nezáporný; pozice u paměťových streamů musí být navíc menší než count().

Posuny u souborových streamů procházejí soubor snímek po snímku od začátku, protože bloky snímků mají proměnnou velikost – u velkých skoků počítejte s časem O(offset).

Vrátí self, takže lze volání řetězit.

sync() ImageIO

Vyprázdní čekající zápisy na disk u souborových streamů (volá podkladovou funkci souborového systému sync). U paměťových streamů nic nedělá.

Vrátí self, takže lze volání řetězit.

close() None

Uzavře stream. Uvolní paměťový buffer (paměťové streamy) nebo zavře soubor (souborové streamy). Po volání close() nelze objekt ImageIO znovu použít; následné operace vyvolají OSError("Stream closed"). Dvojí volání close() nic nedělá.

ImageIO se automaticky uzavře také při uvolnění garbage collectorem (při vytvoření registruje finalizér).

Konstanty

FILE_STREAM: int

Hodnota vracená metodou type() pro streamy podložené souborem.

MEMORY_STREAM: int

Hodnota vracená metodou type() pro streamy v paměti.