4.17. Ovládací prvky senzoru

Kromě pixformat() a framesize() nabízí třída CSI několik ovládacích prvků specifických pro senzor, po kterých dříve či později sáhne téměř každá aplikace – orientaci montáže, expozici, zisk, vyvážení bílé a několik ladicích pomůcek. Každý z nich přímo odpovídá konceptu senzoru, který byl popsán dříve; API jen poskytuje pythonovský úchyt pro zápis do registru, který ovladač provádí pod kapotou.

Všechny níže uvedené metody působí na podkladový senzor. Všechny posílají zápisy do registrů přes řídicí sběrnici I2C senzoru, takže jejich náklady jsou v řádu mikrosekund a nové nastavení se projeví při následující expozici – typicky při příštím snapshot().

4.17.1. Orientace

Kamera neví, jakou stranou nahoru byla namontována. Dva příznaky překlopení aplikované na senzoru otočí obraz správným směrem ještě předtím, než jakýkoli pixel opustí čip:

csi0.hmirror(True)
csi0.vflip(True)

hmirror() překlápí zleva doprava a vflip() překlápí shora dolů. Společně pokrývají případy, které se v praxi vyskytují: desku namontovanou vzhůru nohama (oba příznaky True), desku za zrcadlem se zrcadlovou vrstvou vpředu (pouze hmirror) nebo desku, která se dívá na odraženou scénu zespodu (pouze vflip).

Protože k překlopení dochází ve čtecí logice senzoru, nevzniká žádná zátěž pro CPU ani žádná paměťová režie – snímek dorazí do snímkového bufferu (frame buffer) již správně orientovaný.

4.17.2. Expozice

Expozice je integrační doba – jak dlouho fotodioda v každém pixelu sbírá náboj, než je řádek vyčten, v mikrosekundách. Ovladač startuje s běžící smyčkou automatické expozice senzoru, takže se kamera snaží udržet průměrnou hodnotu pixelu blízko cílové hodnoty. Vypnutí smyčky zafixuje expozici na hodnotu, kterou si aplikace zvolí:

csi0.auto_exposure(False, exposure_us=8000)

Pevná expozice je správnou volbou, když je jas scény stabilní a aplikace potřebuje předvídatelné rozmazání pohybem nebo konzistentní intenzitu mezi snímky pro prahování. Zpětné přečtení aktuální expozice – ať už ji nastavila smyčka nebo aplikace – je samostatné volání:

us = csi0.exposure_us()

Zavolání auto_exposure() s hodnotou True a bez hodnoty expozice předá řízení zpět smyčce.

4.17.3. Zisk

Zisk je zesílení aplikované na napětí pixelu předtím, než dorazí k ADC, v decibelech. Stejně jako u expozice startuje ovladač s běžící smyčkou automatického zisku. Často se vyskytují dva vzory. Omezení horní hranice umožňuje smyčce přizpůsobit se osvětlení, ale brání jí v nekonečném zesilování šumu v tmavých scénách:

csi0.auto_gain(True, gain_db_ceiling=16)

Zafixování pevného zisku je správným krokem, když aplikace zafixuje také expozici – stabilita zisku je důležitá pro aplikace, které porovnávají hodnoty pixelů mezi snímky, jako je sledování barev:

csi0.auto_gain(False, gain_db=0)

Aktuální zisk se čte zpět přes gain_db(). Kdykoli aplikace vypne automatický zisk, měla by vypnout také automatické vyvážení bílé a automatickou expozici – jinak budou stále aktivní řídicí smyčky tahat obraz tak, že zmaří účel pevného zisku.

4.17.4. Vyvážení bílé

Vyvážení bílé je zisk pro jednotlivé kanály, který ISP aplikuje na červený, zelený a modrý kanál vycházející z fáze debayeringu, aby bílý objekt vypadal bíle pod světlem jakékoli barvy. Smyčka automatického vyvážení bílé počítá tyto tři zisky z statistik pro jednotlivé oblasti, které ISP sbírá při každém snímku, a aplikuje je na další snímek.

Většina aplikací nechává smyčku běžet. Běžnou výjimkou je sledování barev – zisky jsou totiž zároveň tím, co bude smyčka přizpůsobovat, aby sledovala barevný objekt, takže pokud se aplikace snaží najít červený blob, smyčka potichu ztlumí červený kanál a blob přestane odpovídat. Uzamčení smyčky to vyřeší:

csi0.auto_whitebal(False)

Pro opakovatelnou kalibraci barev předejte explicitní n-tici (r, g, b) v decibelech – stejné zisky napříč deskami a relacemi:

csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))

Aktuální zisky se čtou zpět jako n-tice přes rgb_gain_db().

4.17.5. Omezení snímkové frekvence

Senzory běží ve výchozím nastavení na své nativní snímkové frekvenci – 30 až 60 snímků za sekundu u většiny součástek, mnohem více u vysokorychlostních senzorů, když je rozlišení dostatečně malé. Omezení frekvence umožňuje aplikaci zpomalit kameru na takovou rychlost, kterou navazující zpracování stíhá:

csi0.framerate(15)

U senzorů, které podporují hardwarové řízení frekvence, volání také prodlouží rozpočet expozice na snímek, což může pomoci při slabém osvětlení; u ostatních ovladač jednoduše přeskočí nadbytečné snímky na úrovni snímkového bufferu (frame buffer).

4.17.6. Testovací vzor

Testovací vzor barevných pruhů je vestavěn ve většině senzorů a je užitečný pro oddělení problému snímání od problému výstupu. Jeho zapnutí obejde pole fotodiod a pošle pevný vzor stejnou cestou pixelových dat:

csi0.colorbar(True)

Pokud testovací vzor vypadá správně, ale živý obraz ne, je chyba v optice nebo v analogovém vstupním obvodu senzoru; pokud je poškozen i testovací vzor, je problém někde na sběrnici pixelových dat nebo v konfiguraci pixformat() / framesize(). Předáním False se vrátíte k živému obrazu.

Kompletní API včetně příkazů ioctl() specifických pro senzor, které zpřístupňují ovládací prvky jedinečné pro konkrétní rodiny senzorů, naleznete v csi.CSI.