class ImageIO – ImageIO-objekt

Klassen ImageIO spelar in och spelar upp strömmar av Image-bildrutor i OpenMV:s inbyggda diskformat. En enskild ström kan innehålla heterogena bildrutor (olika pixelformat/storlekar) och registrerar intervallet mellan bildrutorna för var och en, så att uppspelningen återskapar den ursprungliga bildfrekvensen.

Det finns två lagringsbackender:

  • Filström – bildrutor läses från / läggs till i en fil i filsystemet. Filen inleds med ett 16-byte magiskt huvud OMV IMG STR Vx.y följt av segment per bildruta. Den nuvarande skrivaren genererar V2.0; äldre V1.0- och V1.1-filer går fortfarande att läsa.

  • Minnesström – bildrutor läses från / skrivs till en RAM-buffert med fast storlek som allokeras vid konstruktionstillfället. Användbart för att skicka bildrutor fram och tillbaka genom filter som behöver en inspelning utan att röra filsystemet.

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

Skapa en ImageIO-ström.

Om path är en sträng öppnas en filström vid den sökvägen. mode måste vara något av:

  • 'r' – öppna en befintlig fil för läsning. Det magiska huvudet valideras och versionen (V1.0 / V1.1 / V2.0) registreras för användning av version().

  • 'w' – trunkera / skapa filen och skriv ett nytt magiskt V2.0-huvud. Bildrutor läggs till vid varje write().

Om path är en 3-tupel (w, h, pixformat) allokeras en minnesström. mode är då heltalet antal bildrutefack som ska förallokeras. Bufferten dimensioneras för count bildrutor med (w, h, pixformat) och tillåts inte växa efter skapandet. pixformat är något av image.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG eller image.PNG. För de komprimerade formaten (image.JPEG, image.PNG) uppskattas storleken per fack till 2 bpp; bildrutor som är större än uppskattningen ger upphov till ValueError vid write().

Inspektion

type() int

Returnera strömmens lagringsbackend: FILE_STREAM för en filström, MEMORY_STREAM för en minnesström.

is_closed() bool

Returnera True om close() har anropats på det här objektet. När strömmen väl är stängd ger den OSError("Stream closed") vid alla ytterligare läs-/skriv-/sökoperationer.

count() int

Returnera antalet bildrutor som för närvarande lagras i strömmen. För filströmmar växer detta i takt med att write() lägger till bildrutor; för minnesströmmar är det fast vid konstruktionstillfället.

offset() int

Returnera det aktuella bildruteindexet. Ökas av read() och write(), återställs av seek().

version() int | None

Returnera diskformatets version för filströmmar (10 för V1.0, 11 för V1.1, 20 för V2.0). Returnerar None för minnesströmmar.

buffer_size() int | None

Returnera pixelbuffertens storlek per fack i byte för minnesströmmar (fackstorleken minus det interna Image-bokföringshuvudet). Returnerar None för filströmmar. Använd detta tillsammans med count() för att kontrollera om en viss bildrutestorlek får plats.

size() int

Returnera det totala antalet byte som strömmen förbrukar – filstorleken på disk för filströmmar, eller hela RAM-buffertens storlek (count * per_slot_size inklusive huvudet per fack) för minnesströmmar.

I/O

write(img: Image) ImageIO

Lägg till (filström) eller lagra-vid-offset (minnesström) img och öka offset() med ett.

För filströmmar växer filen i takt med att bildrutor läggs till. Skrivning vid en offset som inte är i slutet trunkerar resten av filen, så att antalet kan minska.

För minnesströmmar skrivs bildrutan in i det aktuella facket; skrivning bortom det sista facket ger upphov till EOFError("End of stream") och skrivning av en bildruta som är större än buffer_size() ger upphov till ValueError("Invalid frame size").

Returnerar self så att anrop kan kedjas.

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

Läs bildrutan vid den aktuella offset(), öka offseten och returnera den nya Image. Speglar uppspelningshalvan av write().

copy_to_fb – när True (standard) placeras den avkodade bildrutan i kamerans bildbuffert (samma plats som en csi.CSI.snapshot() hamnar i), så att den returnerade Image går att rita via IDE-förhandsvisningen. När False allokeras bildrutan istället på MicroPython-heapen.

loop (endast filströmmar) – när True (standard) söker läsning bortom den sista bildrutan tillbaka till den första bildrutan och fortsätter. När False returnerar anropet None när filens slut har nåtts.

pause – när True (standard) blockerar anropet tills det ursprungligen inspelade intervallet mellan bildrutorna har förflutit, så att uppspelningen körs med inspelningens ursprungliga bildfrekvens. Sätt till False för uppspelning så snabbt som möjligt.

seek(offset: int) ImageIO

Flytta offset() till bildrutan offset. offset måste vara icke-negativ; offseter för minnesströmmar måste dessutom vara mindre än count().

Sökningar i filströmmar går igenom filen bildruta för bildruta från början, eftersom bildrutesegmenten är av varierande storlek – räkna med O(offset)-tid för stora hopp.

Returnerar self så att anrop kan kedjas.

sync() ImageIO

Spola väntande skrivningar till disk för filströmmar (anropar det underliggande filsystemets sync). Gör ingenting för minnesströmmar.

Returnerar self så att anrop kan kedjas.

close() None

Stäng strömmen. Frigör minnesbufferten (minnesströmmar) eller stänger filen (filströmmar). Efter close() kan ImageIO-objektet inte återanvändas; efterföljande operationer ger upphov till OSError("Stream closed"). Att anropa close() två gånger gör ingenting.

En ImageIO stängs också automatiskt när den skräpsamlas (den registrerar en finaliserare vid konstruktionstillfället).

Konstanter

FILE_STREAM: int

Värdet som returneras av type() för filbaserade strömmar.

MEMORY_STREAM: int

Värdet som returneras av type() för minnesbaserade strömmar.