4.17. Sensorinställningar

Utöver pixformat() och framesize() exponerar CSI-klassen en handfull kontroller per sensor som nästan varje tillämpning förr eller senare använder – monteringsriktning, exponering, förstärkning, vitbalans och några felsökningshjälpmedel. Var och en mappar direkt mot ett sensorbegrepp som behandlats tidigare; API:et tillhandahåller bara en Python-referens för den registerskrivning som drivrutinen gör under huven.

Alla metoder nedan verkar på den underliggande sensorn. De skickar samtliga registerskrivningar över sensorns I2C-styrbuss, så kostnaden är mikrosekunder och den nya inställningen träder i kraft vid nästa exponering – vanligtvis nästa snapshot().

4.17.1. Orientering

Kameran vet inte hur den har monterats. Två vändningsflaggor som tillämpas på sensorn vänder bilden rätt innan någon pixel lämnar chippet:

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

hmirror() vänder från vänster till höger och vflip() vänder från topp till botten. Tillsammans täcker de de fall som uppstår i praktiken: ett kort monterat upp och ner (båda flaggorna True), ett kort bakom en frontförsilvrad spegel (endast hmirror), eller ett som tittar på en speglad scen underifrån (endast vflip).

Eftersom vändningen sker i sensorns avläsningslogik finns ingen CPU-kostnad och ingen minnesomkostnad – bildrutan landar i bildbufferten redan orienterad.

4.17.2. Exponering

Exponeringen är integrationstiden – hur länge fotodioden i varje pixel samlar laddning innan raden läses ut, i mikrosekunder. Drivrutinen startar med sensorns autoexponeringsslinga igång, så kameran försöker hålla det genomsnittliga pixelvärdet nära ett målvärde. Att inaktivera slingan låser exponeringen vid ett värde som tillämpningen väljer:

csi0.auto_exposure(False, exposure_us=8000)

En fast exponering är rätt val när scenens ljusstyrka är stabil och tillämpningen behöver förutsägbar rörelseoskärpa eller jämn intensitet mellan bildrutor för tröskling. Att läsa tillbaka den aktuella exponeringen – oavsett om slingan eller tillämpningen satte den – är ett separat anrop:

us = csi0.exposure_us()

Att anropa auto_exposure() med True och utan exponeringsvärde lämnar tillbaka kontrollen till slingan.

4.17.3. Förstärkning

Förstärkning är den förstärkare som tillämpas på pixelspänningen innan den når ADC:n, i decibel. Liksom exponeringen startar drivrutinen med autoförstärkningsslingan igång. Två mönster återkommer ofta. Att sätta ett tak låter slingan anpassa sig till belysningen men hindrar den från att förstärka brus i det oändliga i mörka scener:

csi0.auto_gain(True, gain_db_ceiling=16)

Att låsa en fast förstärkning är rätt drag när tillämpningen även låser exponeringen – förstärkningsstabilitet är viktig för tillämpningar som jämför pixelvärden mellan bildrutor, som färgspårning:

csi0.auto_gain(False, gain_db=0)

Den aktuella förstärkningen läses tillbaka via gain_db(). Närhelst tillämpningen inaktiverar autoförstärkning bör den även inaktivera autovitbalans och autoexponering – annars kommer styrslingorna som fortfarande är aktiva att dra omkring bilden på sätt som motverkar den fasta förstärkningen.

4.17.4. Vitbalans

Vitbalans är den förstärkning per kanal som ISP:n tillämpar på de röda, gröna och blå kanalerna som kommer ut ur debayer-steget så att ett vitt objekt ser vitt ut under ljus av valfri färg. Autovitbalansslingan beräknar dessa tre förstärkningar från den statistik per region som ISP:n samlar in på varje bildruta och tillämpar dem på nästa bildruta.

De flesta tillämpningar låter slingan vara igång. Färgspårning är det vanliga undantaget – förstärkningarna är också det som slingan drar omkring för att jaga ett färgat objekt, så om tillämpningen försöker hitta en röd blob kommer slingan i tysthet att dämpa den röda kanalen och bloben kommer att sluta matcha. Att låsa slingan åtgärdar det:

csi0.auto_whitebal(False)

Skicka en explicit (r, g, b)-tupel i decibel för upprepningsbar färgkalibrering – samma förstärkningar över olika kort och sessioner:

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

De aktuella förstärkningarna läses tillbaka som en tupel via rgb_gain_db().

4.17.5. Bildfrekvenstak

Sensorer körs som standard vid sin nativa bildfrekvens – 30 till 60 bildrutor per sekund på de flesta delar, mycket högre på höghastighetssensorerna när framesize är tillräckligt liten. Att begränsa frekvensen låter tillämpningen strypa kameran till vad den efterföljande bearbetningen kan hänga med på:

csi0.framerate(15)

På sensorer som stöder en hårdvarustyrd frekvenskontroll förlänger anropet även exponeringsbudgeten per bildruta, vilket kan hjälpa i svagt ljus; på de övriga hoppar drivrutinen helt enkelt över de extra bildrutorna på bildbuffertnivå.

4.17.6. Testmönster

Färgstapeltestmönstret är inbyggt i de flesta sensorer och användbart för att skilja ett bildtagningsproblem från ett utdataproblem. Att slå på det förbigår fotodiodmatrisen och skickar ett fast mönster ned genom samma pixeldataväg:

csi0.colorbar(True)

Om testmönstret ser rätt ut men den live-bilden inte gör det ligger felet i optiken eller sensorns analoga frontend; om till och med testmönstret är korrupt ligger problemet någonstans på pixeldatabussen eller i konfigurationen av pixformat() / framesize(). Skicka False för att återgå till live-bilden.

Se csi.CSI för det fullständiga API:et, inklusive de sensorspecifika ioctl()-kommandona som exponerar kontroller som är unika för särskilda sensorfamiljer.