4.17. Sensorinstellingen¶
Naast pixformat() en framesize() biedt de CSI-klasse een handvol bedieningselementen per sensor waar vrijwel elke toepassing vroeg of laat naar grijpt – montageorientatie, belichting, versterking, witbalans en een paar hulpmiddelen voor debuggen. Elk ervan komt rechtstreeks overeen met een sensorconcept dat eerder is behandeld; de API biedt simpelweg een Python-handvat voor de registerschrijfopdracht die de driver eronder uitvoert.
Alle onderstaande methoden werken in op de onderliggende sensor. Ze sturen allemaal registerschrijfopdrachten over de I2C-besturingsbus van de sensor, dus de kosten bedragen microseconden en de nieuwe instelling wordt van kracht bij de volgende belichting – doorgaans de volgende snapshot().
4.17.1. Orientatie¶
De camera weet niet welke kant boven gemonteerd is. Twee flip-vlaggen die op de sensor worden toegepast, zetten het beeld de juiste kant op voordat er ook maar een pixel de chip verlaat:
csi0.hmirror(True)
csi0.vflip(True)
hmirror() spiegelt van links naar rechts en vflip() spiegelt van boven naar onder. Samen dekken ze de gevallen die in de praktijk voorkomen: een ondersteboven gemonteerd bord (beide vlaggen True), een bord achter een aan de voorzijde verzilverde spiegel (alleen hmirror) of een bord dat van onderaf naar een gereflecteerde scene kijkt (alleen vflip).
Omdat de spiegeling plaatsvindt in de uitleeslogica van de sensor, zijn er geen CPU-kosten en geen geheugenoverhead – het frame komt al georienteerd in de framebuffer terecht.
4.17.2. Belichting¶
Belichting is de integratietijd – hoe lang de fotodiode in elke pixel lading verzamelt voordat de rij wordt uitgelezen, in microseconden. De driver start met de auto-belichtingslus van de sensor actief, zodat de camera de gemiddelde pixelwaarde dicht bij een doelwaarde probeert te houden. Door de lus uit te schakelen wordt de belichting vastgezet op een waarde die de toepassing kiest:
csi0.auto_exposure(False, exposure_us=8000)
Een vaste belichting is de juiste keuze wanneer de helderheid van de scene stabiel is en de toepassing voorspelbare bewegingsonscherpte of consistente intensiteit van frame tot frame nodig heeft voor het toepassen van een drempelwaarde. Het terugkenlezen van de huidige belichting – of die nu door de lus of door de toepassing is ingesteld – is een aparte aanroep:
us = csi0.exposure_us()
Het aanroepen van auto_exposure() met True en zonder belichtingswaarde geeft de controle terug aan de lus.
4.17.3. Versterking¶
Versterking is de versterker die op de pixelspanning wordt toegepast voordat deze de ADC bereikt, in decibel. Net als bij belichting start de driver met de auto-versterkingslus aan. Twee patronen komen vaak voor. Het begrenzen van het plafond laat de lus zich aanpassen aan de belichting, maar voorkomt dat deze ruis onbeperkt versterkt in donkere scenes:
csi0.auto_gain(True, gain_db_ceiling=16)
Het vastzetten van een vaste versterking is de juiste keuze wanneer de toepassing ook de belichting vastzet – versterkingsstabiliteit is belangrijk voor toepassingen die pixelwaarden van frame tot frame vergelijken, zoals kleurvolging:
csi0.auto_gain(False, gain_db=0)
De huidige versterking wordt teruggelezen via gain_db(). Telkens wanneer de toepassing auto-versterking uitschakelt, moet deze ook auto-witbalans en auto-belichting uitschakelen – anders zullen de besturingslussen die nog actief zijn de afbeelding op manieren beinvloeden die de vaste versterking tenietdoen.
4.17.4. Witbalans¶
Witbalans is de versterking per kanaal die de ISP toepast op de rode, groene en blauwe kanalen die uit de debayer-fase komen, zodat een wit object er wit uitziet onder elke kleur licht. De auto-witbalanslus berekent die drie versterkingen uit de statistieken per regio die de ISP bij elk frame verzamelt en past ze toe bij het volgende frame.
De meeste toepassingen laten de lus actief. Kleurvolging is de gebruikelijke uitzondering – de versterkingen zijn ook wat de lus zal aanpassen om een gekleurd object te volgen, dus als de toepassing een rode blob probeert te vinden, zal de lus stilletjes het rode kanaal dimmen en zal de blob niet langer overeenkomen. Het vergrendelen van de lus verhelpt dat:
csi0.auto_whitebal(False)
Geef een expliciete (r, g, b)-tuple in decibel door voor herhaalbare kleurkalibratie – dezelfde versterkingen over verschillende borden en sessies:
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
De huidige versterkingen worden als een tuple teruggelezen via rgb_gain_db().
4.17.5. Limiet voor framesnelheid¶
Sensoren werken standaard op hun eigen framesnelheid – 30 tot 60 frames per seconde op de meeste onderdelen, veel hoger op de hogesnelheidssensoren wanneer de framesize klein genoeg is. Door de snelheid te begrenzen kan de toepassing de camera afknijpen tot wat de downstream-verwerking kan bijhouden:
csi0.framerate(15)
Op sensoren die een hardwarematige snelheidsregeling ondersteunen, verlengt de aanroep ook het belichtingsbudget per frame, wat kan helpen bij weinig licht; op de andere slaat de driver de extra frames simpelweg over op framebuffer-niveau.
4.17.6. Testpatroon¶
Het kleurenbalk-testpatroon is in de meeste sensoren ingebouwd en nuttig om een beeldvormingsprobleem te scheiden van een uitvoerprobleem. Door het in te schakelen wordt de fotodiodematrix omzeild en wordt een vast patroon door hetzelfde pixeldatapad gestuurd:
csi0.colorbar(True)
Als het testpatroon er goed uitziet maar de live-afbeelding niet, ligt de fout in de optiek of in de analoge front-end van de sensor; als zelfs het testpatroon beschadigd is, zit het probleem ergens op de pixeldatabus of in de pixformat()- / framesize()-configuratie. Geef False door om terug te keren naar de live-afbeelding.
Zie csi.CSI voor de volledige API, inclusief de sensorspecifieke ioctl()-commando’s die bedieningselementen blootstellen die uniek zijn voor bepaalde sensorfamilies.