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.