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.yurmat de blocuri per cadru. Scriitorul actual emiteV2.0; fișierele mai vechiV1.0șiV1.1pot 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ă
patheste un șir de caractere, se deschide un flux de fișier la calea respectivă.modetrebuie să fie una dintre:Dacă
patheste un tuplu cu 3 elemente(w, h, pixformat), se alocă un flux de memorie.modereprezintă atunci numărul întreg de sloturi de cadre care urmează a fi prealocat. Tamponul (buffer) este dimensionat pentrucountcadre de(w, h, pixformat)și nu i se permite să crească după creare.pixformateste unul dintreimage.BINARY,image.GRAYSCALE,image.RGB565,image.BAYER,image.YUV422,image.JPEGsauimage.PNG. Pentru formatele comprimate (image.JPEG,image.PNG) dimensiunea per slot este estimată la 2 bpp; cadrele mai mari decât estimarea genereazăValueErrorla momentul apeluluiwrite().Inspectare¶
- type() int¶
Returnează mediul de stocare de bază al fluxului:
FILE_STREAMpentru un flux de fișier,MEMORY_STREAMpentru un flux de memorie.
- is_closed() bool¶
Returnează
Truedacă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()șiwrite(), resetat deseek().
- version() int | None¶
Returnează versiunea formatului pe disc pentru fluxurile de fișier (
10pentruV1.0,11pentruV1.1,20pentruV2.0). ReturneazăNonepentru 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ăNonepentru fluxurile de fișier. Folosiți această valoare împreună cucount()pentru a verifica dacă o anumită dimensiune de cadru va încăpea.
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âtbuffer_size()genereazăValueError("Invalid frame size").Returnează
selfpentru 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 imagineImage. Reflectă jumătatea de redare a metodeiwrite().copy_to_fb– când esteTrue(implicit), cadrul decodat este plasat în tamponul de cadre (frame buffer) al camerei (același loc în care ajunge uncsi.CSI.snapshot()), astfel încât imagineaImagereturnată poate fi desenată prin previzualizarea din IDE. Când esteFalse, cadrul este alocat în schimb pe heap-ul MicroPython.loop(doar fluxuri de fișier) – când esteTrue(implicit), citirea dincolo de ultimul cadru revine la primul cadru și continuă. Când esteFalse, apelul returneazăNoneodată ce se ajunge la sfârșitul fișierului.pause– când esteTrue(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 laFalsepentru o redare cât mai rapidă posibil.
- seek(offset: int) ImageIO¶
Mută
offset()la cadruloffset.offsettrebuie să fie non-negativ; pozițiile fluxurilor de memorie trebuie de asemenea să fie mai mici decâtcount().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ă
selfpentru ca apelurile să poată fi înlănțuite.
- sync() ImageIO¶
Golește scrierile în așteptare pe disc pentru fluxurile de fișier (apelează
syncal sistemului de fișiere subiacent). Nu are efect pentru fluxurile de memorie.Returnează
selfpentru 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()obiectulImageIOnu poate fi reutilizat; operațiile ulterioare genereazăOSError("Stream closed"). Apelareaclose()de două ori nu are efect.Un
ImageIOeste de asemenea închis automat atunci când este eliminat de garbage collector (înregistrează un finalizator la construire).
Constante¶