4.16. Pregled slike

Skup međuspremnika slike mjesto je gdje aplikacija čita svoje sličice. Dok aplikacija radi na tim sličicama, ono što je spojeno na kameru radi njihova pregleda također treba kopiju svake sličice. Kamera za tu svrhu ima drugi, namjenski međuspremnik te jedno pravilo o tome kada se on puni: svaki put kada aplikacija pozove snapshot(), prethodno snimljena sličica kopira se u međuspremnik pregleda prije nego što se nova sličica vrati.

Aplikacija i preglednik nikada se ne natječu za istu memoriju. Aplikacija čita svoju sličicu iz skupa; preglednik čita svoju sličicu iz međuspremnika pregleda. Oboje se odvija usporedno.

4.16.1. Međuspremnik streama

Međuspremnik pregleda – međuspremnik streama – jedinstveno je područje RAM-a fiksne veličine odvojeno od skupa međuspremnika slike. Njegova se veličina postavlja pri izgradnji ugrađenog programa (firmware) i ne mijenja se s framesize() ili pixformat(). Otprilike megabajt uobičajen je na novijim OpenMV Cam uređajima – dovoljno velik da primi pregled umjerene razlučivosti, mnogo manji od sličice pune razlučivosti pri najvećim veličinama senzora.

Kod aplikacije ne čita niti piše izravno u taj međuspremnik; upravljački program kamere puni ga kao nuspojavu snapshot().

4.16.2. Što snimak čini za pregled

Pri svakom pozivu snapshot(), prije nego što upravljački program vrati prethodni međuspremnik slike aplikacije natrag u skup i preda novi, on kopira prethodnu sličicu u međuspremnik pregleda – s onime što je aplikacija nacrtala povrh nje tijekom obrade i dalje na slici. Moguće su dvije grane. Koja se izvodi bira preglednik, a ne kamera: potrošač koji je otvorio pregled govori upravljačkom programu želi li sirovu sliku ili JPEG i koju veličinu sirovog prozora može prihvatiti.

  • Sirova umanjena kopija. Kada je preglednik zatražio sirove sličice, upravljački program kopira prethodnu sličicu u njezinom izvornom formatu piksela (RGB565, sivi tonovi itd.). Ako je sličica veća od sirovog prozora koji je preglednik zatražio, upravljački program je smanjuje bilinearnim filtriranjem dok ne stane; inače pikseli prolaze nepromijenjeni. Nema artefakata kompresije; preglednik vidi iste piksele na kojima je aplikacija radila.

  • JPEG kompresija. Kada je preglednik zatražio JPEG – ili kada sirova kopija uopće ne bi stala u međuspremnik streama – upravljački program JPEG kompresira prethodnu sličicu u njezinoj punoj razlučivosti u međuspremnik streama. Kvaliteta se prilagođava adaptivno po sličici tako da komprimirani izlaz ostane unutar kapaciteta međuspremnika streama. Kada sličica stane, upravljački program postupno podiže kvalitetu za jedan korak prema gornjoj granici koja ovisi o veličini piksela snimljene sličice (manjim sličicama dopuštena je viša kvaliteta; veće sličice ograničene su niže kako se ne bi prelile pri maloj promjeni sadržaja). Kada sličica ne stane, upravljački program prepolovi trenutačnu kvalitetu, drži je na smanjenoj razini sljedećih nekoliko desetaka sličica kako bi se nova postavka stigla ustaliti i izbacuje prelivenu sličicu iz pregleda. Petlja aplikacije nastavlja raditi neometano; samo preglednik propušta izbačenu sličicu.

Sličice koje kamera proizvodi u formatu koji je već komprimiran (JPEG format piksela na senzorima koji izravno emitiraju JPEG) preskaču obje grane: kodirani bitstream kopira se ravno u međuspremnik pregleda takav kakav jest.

Preglednik anketira po vlastitom rasporedu, općenito mnogo sporije nego što kamera snima, pa poduzorkuje sirovu brzinu snimanja: prikazuju se samo oni snimci koje stigne na vrijeme pročitati. Ako svježa snapshot() stigne u međuspremnik pregleda prije nego što je preglednik pročitao prethodnu sličicu, međuspremnik je još zaključan od strane preglednika i novo ažuriranje pregleda preskače se – ta je snimka izgubljena iz streama pregleda. Vlastiti skup međuspremnika slike aplikacije nije pogođen; snimljena sličica i dalje normalno odlazi aplikaciji.

4.16.3. Ručno guranje posljednje sličice

Budući da se pregled ažurira kao nuspojava snapshot(), skripta koja završi a da nikada ponovno ne pozove snimak ostavlja ono što je posljednje poslala u pregled na pregledniku neograničeno dugo – što je, za skriptu koja svoj posao obavi prije prvog snimka i zatim izađe, prazan pregled. image.Image.flush() (ili ekvivalentna flush() na CSI objektu) na zahtjev kopira trenutačni sadržaj međuspremnika slike aplikacije u međuspremnik streama, bez snimanja nove sličice:

img = csi0.snapshot()
# process the image and draw on it
img.flush()                               # previewer sees the annotated frame

Isti je poziv koristan i kada se dugotrajna operacija nalazi između snimaka i kada bi preglednik inače cijelo vrijeme prikazivao zastarjeli pregled.

Napomena

Aplikacija za pregled mora pročitati sličicu iz međuspremnika streama prije nego što skripta izađe. Flush na kraju kratke skripte samo priprema sličicu; ako skripta zatim vrati kontrolu kameri prije nego što je preglednik anketirao, međuspremnik se ponovno koristi pri sljedećem pokretanju i ta je posljednja sličica izgubljena. Za preglede na kraju skripte, dajte pregledniku trenutak da preuzme sličicu (kratko spavanje nakon flusha ili jednostavno ne izlazite odmah) prije nego što skripta završi.