clasa ImageIO – obiectul ImageIO

Clasa ImageIO înregistrează și redă fluxuri de cadre Image în formatul nativ pe disc al OpenMV. Un singur flux poate conține cadre eterogene (formate de pixeli / dimensiuni diferite) și înregistrează intervalul dintre cadre pentru fiecare dintre ele, astfel încât redarea recreează rata de cadre originală.

Există două medii de stocare de bază:

  • Flux de fișier – cadrele sunt citite din / adăugate la un fișier din sistemul de fișiere. Fișierul începe cu un antet magic de 16 octeți OMV IMG STR Vx.y urmat de blocuri per cadru. Scriitorul actual emite V2.0; fișierele mai vechi V1.0 și V1.1 pot fi încă citite.

  • Flux de memorie – cadrele sunt citite din / scrise într-un tampon (buffer) RAM de dimensiune fixă alocat în momentul construirii. Util pentru a trece cadre prin filtre care necesită o înregistrare fără a accesa sistemul de fișiere.

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

Creează un flux ImageIO.

Dacă path este un șir de caractere, se deschide un flux de fișier la calea respectivă. mode trebuie să fie una dintre:

  • 'r' – deschide un fișier existent pentru citire. Antetul magic este validat, iar versiunea (V1.0 / V1.1 / V2.0) este înregistrată pentru a fi utilizată de version().

  • 'w' – trunchiază / creează fișierul și scrie un antet magic V2.0 nou. Cadrele sunt adăugate la fiecare apel write().

Dacă path este un tuplu cu 3 elemente (w, h, pixformat), se alocă un flux de memorie. mode reprezintă atunci numărul întreg de sloturi de cadre care urmează a fi prealocat. Tamponul (buffer) este dimensionat pentru count cadre de (w, h, pixformat) și nu i se permite să crească după creare. pixformat este unul dintre image.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG sau image.PNG. Pentru formatele comprimate (image.JPEG, image.PNG) dimensiunea per slot este estimată la 2 bpp; cadrele mai mari decât estimarea generează ValueError la momentul apelului write().

Inspectare

type() int

Returnează mediul de stocare de bază al fluxului: FILE_STREAM pentru un flux de fișier, MEMORY_STREAM pentru un flux de memorie.

is_closed() bool

Returnează True dacă close() a fost apelată pe acest obiect. Odată închis, fluxul generează OSError("Stream closed") la orice operație ulterioară de citire/scriere/poziționare.

count() int

Returnează numărul de cadre stocate în prezent în flux. Pentru fluxurile de fișier acesta crește pe măsură ce write() adaugă cadre; pentru fluxurile de memorie este fix, stabilit în momentul construirii.

offset() int

Returnează indexul cadrului curent. Este incrementat de read() și write(), resetat de seek().

version() int | None

Returnează versiunea formatului pe disc pentru fluxurile de fișier (10 pentru V1.0, 11 pentru V1.1, 20 pentru V2.0). Returnează None pentru fluxurile de memorie.

buffer_size() int | None

Returnează dimensiunea tamponului (buffer) de pixeli per slot, în octeți, pentru fluxurile de memorie (dimensiunea slotului minus antetul intern de gestionare al Image). Returnează None pentru fluxurile de fișier. Folosiți această valoare împreună cu count() pentru a verifica dacă o anumită dimensiune de cadru va încăpea.

size() int

Returnează numărul total de octeți consumați de flux – dimensiunea fișierului pe disc pentru fluxurile de fișier, sau dimensiunea completă a tamponului (buffer) RAM (count * per_slot_size incluzând antetul per slot) pentru fluxurile de memorie.

I/O

write(img: Image) ImageIO

Adaugă (flux de fișier) sau stochează la o anumită poziție (flux de memorie) img și avansează offset() cu unu.

Pentru fluxurile de fișier, fișierul crește pe măsură ce cadrele sunt adăugate. Scrierea la o poziție care nu este la sfârșit trunchiază restul fișierului, astfel încât numărul de cadre poate scădea.

Pentru fluxurile de memorie, cadrul este scris în slotul curent; scrierea dincolo de ultimul slot generează EOFError("End of stream"), iar scrierea unui cadru mai mare decât buffer_size() generează ValueError("Invalid frame size").

Returnează self pentru ca apelurile să poată fi înlănțuite.

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

Citește cadrul de la poziția curentă offset(), avansează poziția și returnează noua imagine Image. Reflectă jumătatea de redare a metodei write().

copy_to_fb – când este True (implicit), cadrul decodat este plasat în tamponul de cadre (frame buffer) al camerei (același loc în care ajunge un csi.CSI.snapshot()), astfel încât imaginea Image returnată poate fi desenată prin previzualizarea din IDE. Când este False, cadrul este alocat în schimb pe heap-ul MicroPython.

loop (doar fluxuri de fișier) – când este True (implicit), citirea dincolo de ultimul cadru revine la primul cadru și continuă. Când este False, apelul returnează None odată ce se ajunge la sfârșitul fișierului.

pause – când este True (implicit), apelul se blochează până când a trecut intervalul dintre cadre înregistrat inițial, astfel încât redarea rulează la rata de cadre nativă a înregistrării. Setați la False pentru o redare cât mai rapidă posibil.

seek(offset: int) ImageIO

Mută offset() la cadrul offset. offset trebuie să fie non-negativ; pozițiile fluxurilor de memorie trebuie de asemenea să fie mai mici decât count().

Poziționarea în fluxurile de fișier parcurge fișierul cadru cu cadru de la început, deoarece blocurile de cadre au dimensiuni variabile – așteptați-vă la un timp O(offset) pentru salturi mari.

Returnează self pentru ca apelurile să poată fi înlănțuite.

sync() ImageIO

Golește scrierile în așteptare pe disc pentru fluxurile de fișier (apelează sync al sistemului de fișiere subiacent). Nu are efect pentru fluxurile de memorie.

Returnează self pentru ca apelurile să poată fi înlănțuite.

close() None

Închide fluxul. Eliberează tamponul (buffer) de memorie (fluxuri de memorie) sau închide fișierul (fluxuri de fișier). După close() obiectul ImageIO nu poate fi reutilizat; operațiile ulterioare generează OSError("Stream closed"). Apelarea close() de două ori nu are efect.

Un ImageIO este de asemenea închis automat atunci când este eliminat de garbage collector (înregistrează un finalizator la construire).

Constante

FILE_STREAM: int

Valoarea returnată de type() pentru fluxurile bazate pe fișier.

MEMORY_STREAM: int

Valoarea returnată de type() pentru fluxurile în memorie.