4.17. Reglaje ale senzorului

Dincolo de pixformat() și framesize(), clasa CSI expune o serie de controale per-senzor pe care aproape orice aplicație ajunge să le folosească mai devreme sau mai târziu – orientarea de montare, expunerea, amplificarea (gain), balansul de alb și câteva instrumente de depanare. Fiecare corespunde direct unui concept al senzorului prezentat anterior; API-ul oferă doar un identificator Python pentru scrierea în registru pe care driverul o efectuează în spate.

Toate metodele de mai jos acționează asupra senzorului subiacent. Toate trimit scrieri în registre prin magistrala de control I2C a senzorului, astfel încât costul este de ordinul microsecundelor, iar noua setare intră în vigoare la următoarea expunere – de regulă următoarea snapshot().

4.17.1. Orientare

Camera nu știe cu ce parte în sus a fost montată. Două indicatoare de răsturnare aplicate la nivelul senzorului întorc imaginea în poziția corectă înainte ca vreun pixel să părăsească cipul:

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

hmirror() răstoarnă imaginea de la stânga la dreapta, iar vflip() o răstoarnă de sus în jos. Împreună acoperă situațiile care apar în practică: o placă montată cu susul în jos (ambele indicatoare True), o placă aflată în spatele unei oglinzi cu argintare frontală (doar hmirror) sau una care privește o scenă reflectată de jos (doar vflip).

Deoarece răsturnarea se produce în logica de citire a senzorului, nu există cost CPU și nici suprasarcină de memorie – cadrul ajunge în tamponul de cadre (frame buffer) deja orientat.

4.17.2. Expunere

Expunerea este timpul de integrare – cât timp fotodioda din fiecare pixel acumulează sarcină electrică înainte ca rândul să fie citit, exprimat în microsecunde. Driverul pornește cu bucla de expunere automată a senzorului activă, astfel încât camera încearcă să mențină valoarea medie a pixelilor aproape de o țintă. Dezactivarea buclei fixează expunerea la o valoare aleasă de aplicație:

csi0.auto_exposure(False, exposure_us=8000)

O expunere fixă este alegerea potrivită atunci când luminozitatea scenei este stabilă și aplicația are nevoie de o estompare de mișcare previzibilă sau de o intensitate consecventă de la cadru la cadru pentru aplicarea pragurilor. Citirea expunerii curente – fie că a setat-o bucla, fie aplicația – se face printr-un apel separat:

us = csi0.exposure_us()

Apelarea auto_exposure() cu True și fără o valoare de expunere predă controlul înapoi buclei.

4.17.3. Amplificare (gain)

Amplificarea (gain) este factorul aplicat tensiunii pixelului înainte ca aceasta să ajungă la ADC, exprimat în decibeli. La fel ca expunerea, driverul pornește cu bucla de amplificare automată activă. Apar frecvent două tipare. Limitarea plafonului permite buclei să se adapteze la iluminare, dar o împiedică să amplifice zgomotul la nesfârșit în scenele întunecate:

csi0.auto_gain(True, gain_db_ceiling=16)

Fixarea unei amplificări constante este mișcarea potrivită atunci când aplicația fixează și expunerea – stabilitatea amplificării contează pentru aplicațiile care compară valorile pixelilor de la cadru la cadru, cum ar fi urmărirea culorilor:

csi0.auto_gain(False, gain_db=0)

Amplificarea curentă se citește prin gain_db(). Ori de câte ori aplicația dezactivează amplificarea automată, ar trebui să dezactiveze și balansul automat de alb și expunerea automată – altfel buclele de control rămase active vor modifica imaginea în moduri care anulează amplificarea fixă.

4.17.4. Balans de alb

Balansul de alb este amplificarea per-canal pe care ISP-ul o aplică pe canalele roșu, verde și albastru rezultate din etapa de debayer, astfel încât un obiect alb să arate alb sub orice culoare a luminii. Bucla de balans automat de alb calculează aceste trei amplificări pornind de la statisticile per-regiune pe care ISP-ul le colectează pentru fiecare cadru și le aplică la cadrul următor.

Majoritatea aplicațiilor lasă bucla activă. Urmărirea culorilor este excepția obișnuită – amplificările sunt totodată ceea ce bucla modifică pentru a urmări un obiect colorat, așa că, dacă aplicația încearcă să găsească un blob roșu, bucla va atenua discret canalul roșu, iar blobul va înceta să mai corespundă. Blocarea buclei rezolvă acest lucru:

csi0.auto_whitebal(False)

Transmiteți un tuplu explicit (r, g, b) în decibeli pentru o calibrare de culoare reproductibilă – aceleași amplificări pe toate plăcile și sesiunile:

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

Amplificările curente se citesc ca un tuplu prin rgb_gain_db().

4.17.5. Limitarea ratei de cadre

În mod implicit, senzorii funcționează la rata lor nativă de cadre – 30 până la 60 de cadre pe secundă pe majoritatea componentelor, mult mai mare pe senzorii de mare viteză atunci când dimensiunea cadrului este suficient de mică. Limitarea ratei permite aplicației să restrângă camera la o valoare cu care procesarea ulterioară poate ține pasul:

csi0.framerate(15)

Pe senzorii care acceptă un control hardware al ratei, apelul prelungește totodată bugetul de expunere per cadru, ceea ce poate ajuta la lumină slabă; pe ceilalți, driverul pur și simplu omite cadrele suplimentare la nivelul tamponului de cadre (frame buffer).

4.17.6. Model de test

Modelul de test cu bare de culoare este integrat în majoritatea senzorilor și util pentru a separa o problemă de captare a imaginii de o problemă de ieșire. Activarea lui ocolește matricea de fotodiode și trimite un model fix pe aceeași cale de date a pixelilor:

csi0.colorbar(True)

Dacă modelul de test arată corect, dar imaginea live nu, defectul se află în optică sau în partea analogică frontală a senzorului; dacă până și modelul de test este corupt, problema este undeva pe magistrala de date a pixelilor sau în configurația pixformat() / framesize(). Transmiteți False pentru a reveni la imaginea live.

Consultați csi.CSI pentru API-ul complet, inclusiv comenzile ioctl() specifice senzorului care expun controale unice anumitor familii de senzori.