4.17. Postavke senzora¶
Osim pixformat() i framesize(), klasa CSI izlaže nekoliko kontrola po senzoru za kojima gotovo svaka aplikacija prije ili kasnije posegne – orijentacija montaže, ekspozicija, pojačanje, ravnoteža bijele i nekoliko pomagala za otklanjanje pogrešaka. Svaka se izravno preslikava na koncept senzora obrađen ranije; API samo pruža Python ručku za upis u registar koji upravljački program obavlja ispod.
Sve metode u nastavku djeluju na temeljni senzor. Sve one šalju upise u registre preko senzorske I2C upravljačke sabirnice, pa je trošak u rasponu mikrosekundi, a nova postavka stupa na snagu pri sljedećoj ekspoziciji – obično pri sljedećoj snapshot().
4.17.1. Orijentacija¶
Kamera ne zna na koji je način okrenuta pri montaži. Dvije zastavice za zrcaljenje primijenjene na senzoru okreću sliku u ispravan položaj prije nego što ijedan piksel napusti čip:
csi0.hmirror(True)
csi0.vflip(True)
hmirror() zrcali slijeva-nadesno, a vflip() zrcali odozgo-prema-dolje. Zajedno pokrivaju slučajeve koji se javljaju u praksi: ploča montirana naopako (obje zastavice True), ploča iza sprijeda posrebrenog zrcala (samo hmirror) ili ona koja gleda odraženu scenu odozdo (samo vflip).
Budući da se zrcaljenje događa u logici očitavanja senzora, nema troška za CPU ni dodatnog opterećenja memorije – sličica stiže u međuspremnik slike već ispravno orijentirana.
4.17.2. Ekspozicija¶
Ekspozicija je vrijeme integracije – koliko dugo fotodioda u svakom pikselu prikuplja naboj prije nego što se red očita, izraženo u mikrosekundama. Upravljački program kreće s pokrenutom petljom automatske ekspozicije senzora, pa kamera nastoji održavati prosječnu vrijednost piksela blizu ciljane. Onemogućavanje petlje veže ekspoziciju na vrijednost koju aplikacija odabere:
csi0.auto_exposure(False, exposure_us=8000)
Fiksna ekspozicija je ispravan izbor kada je svjetlina scene stabilna, a aplikaciji je potrebno predvidljivo zamućenje pokreta ili dosljedan intenzitet od sličice do sličice za određivanje praga. Očitavanje trenutne ekspozicije – bilo da ju je postavila petlja ili aplikacija – zaseban je poziv:
us = csi0.exposure_us()
Pozivanje auto_exposure() s True i bez vrijednosti ekspozicije predaje kontrolu natrag petlji.
4.17.3. Pojačanje¶
Pojačanje je pojačalo primijenjeno na napon piksela prije nego što dosegne ADC, izraženo u decibelima. Kao i ekspozicija, upravljački program kreće s uključenom petljom automatskog pojačanja. Često se javljaju dva obrasca. Ograničavanje gornje granice omogućuje petlji da se prilagodi osvjetljenju, ali je sprječava da neograničeno pojačava šum u mračnim scenama:
csi0.auto_gain(True, gain_db_ceiling=16)
Vezanje fiksnog pojačanja ispravan je potez kada aplikacija veže i ekspoziciju – stabilnost pojačanja važna je za aplikacije koje uspoređuju vrijednosti piksela od sličice do sličice, poput praćenja boja:
csi0.auto_gain(False, gain_db=0)
Trenutno pojačanje očitava se kroz gain_db(). Kad god aplikacija onemogući automatsko pojačanje, trebala bi onemogućiti i automatsku ravnotežu bijele te automatsku ekspoziciju – u protivnom će upravljačke petlje koje su još aktivne razvlačiti sliku na načine koji poništavaju fiksno pojačanje.
4.17.4. Ravnoteža bijele¶
Ravnoteža bijele je pojačanje po kanalu koje ISP primjenjuje na crveni, zeleni i plavi kanal koji izlaze iz faze debayeringa kako bi bijeli objekt izgledao bijelo pod svjetlom bilo koje boje. Petlja automatske ravnoteže bijele izračunava ta tri pojačanja iz statistike po regijama koju ISP prikuplja na svakoj sličici i primjenjuje ih na sljedećoj sličici.
Većina aplikacija ostavlja petlju pokrenutom. Praćenje boja čest je iznimak – pojačanja su upravo ono što će petlja razvlačiti da bi pratila obojeni objekt, pa ako aplikacija pokušava pronaći crvenu mrlju, petlja će tiho prigušiti crveni kanal i mrlja će prestati odgovarati. Zaključavanje petlje to rješava:
csi0.auto_whitebal(False)
Proslijedite eksplicitnu (r, g, b) n-torku u decibelima za ponovljivu kalibraciju boja – ista pojačanja na svim pločama i u svim sesijama:
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
Trenutna pojačanja očitavaju se kao n-torka kroz rgb_gain_db().
4.17.5. Ograničenje broja sličica¶
Senzori prema zadanim postavkama rade pri svojoj izvornoj brzini sličica – 30 do 60 sličica u sekundi na većini dijelova, znatno više na brzim senzorima kada je veličina sličice dovoljno mala. Ograničavanje brzine omogućuje aplikaciji da priguši kameru na ono s čime obrada nizvodno može držati korak:
csi0.framerate(15)
Na senzorima koji podržavaju hardversku kontrolu brzine taj poziv također produljuje proračun ekspozicije po sličici, što može pomoći pri slabom svjetlu; na ostalima upravljački program jednostavno preskače dodatne sličice na razini međuspremnika slike.
4.17.6. Testni uzorak¶
Testni uzorak s prugama u boji ugrađen je u većinu senzora i koristan je za razdvajanje problema snimanja od problema izlaza. Njegovo uključivanje zaobilazi polje fotodioda i šalje fiksni uzorak istim putem podataka piksela:
csi0.colorbar(True)
Ako testni uzorak izgleda ispravno, ali živa slika ne, kvar je u optici ili u analognom ulaznom dijelu senzora; ako je čak i testni uzorak oštećen, problem je negdje na sabirnici podataka piksela ili u konfiguraciji pixformat() / framesize(). Proslijedite False za povratak na živu sliku.
Pogledajte csi.CSI za potpuni API, uključujući naredbe ioctl() specifične za senzor koje izlažu kontrole jedinstvene za pojedine obitelji senzora.