4.17. Sensor-Einstellregler

Über pixformat() und framesize() hinaus stellt die Klasse CSI eine Handvoll sensorspezifischer Einstellungen bereit, nach denen früher oder später fast jede Anwendung greift – Einbauorientierung, Belichtung, Verstärkung, Weißabgleich und einige Debugging-Hilfen. Jede davon entspricht direkt einem zuvor behandelten Sensorkonzept; die API liefert lediglich einen Python-Zugriff auf den Register-Schreibvorgang, den der Treiber darunter ausführt.

Alle nachfolgenden Methoden wirken auf den darunterliegenden Sensor. Sie alle schicken Register-Schreibvorgänge über den I2C-Steuerbus des Sensors, sodass die Kosten im Mikrosekundenbereich liegen und die neue Einstellung bei der nächsten Belichtung wirksam wird – typischerweise beim nächsten snapshot().

4.17.1. Orientierung

Die Kamera weiß nicht, in welcher Lage sie eingebaut wurde. Zwei am Sensor angewendete Spiegel-Flags drehen das Bild richtig herum, bevor irgendein Pixel den Chip verlässt:

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

hmirror() spiegelt von links nach rechts und vflip() spiegelt von oben nach unten. Zusammen decken sie die in der Praxis vorkommenden Fälle ab: eine kopfüber montierte Platine (beide Flags True), eine Platine hinter einem oberflächenverspiegelten Spiegel (nur hmirror) oder eine, die eine reflektierte Szene von unten betrachtet (nur vflip).

Da die Spiegelung in der Ausleselogik des Sensors stattfindet, gibt es keine CPU-Kosten und keinen Speicheraufwand – das Einzelbild landet bereits korrekt ausgerichtet im Framebuffer.

4.17.2. Belichtung

Die Belichtung ist die Integrationszeit – wie lange die Fotodiode in jedem Pixel Ladung sammelt, bevor die Zeile ausgelesen wird, in Mikrosekunden. Der Treiber startet mit laufender Auto-Belichtungsschleife des Sensors, sodass die Kamera versucht, den durchschnittlichen Pixelwert nahe einem Zielwert zu halten. Das Deaktivieren der Schleife fixiert die Belichtung auf einen von der Anwendung gewählten Wert:

csi0.auto_exposure(False, exposure_us=8000)

Eine feste Belichtung ist die richtige Wahl, wenn die Szenenhelligkeit stabil ist und die Anwendung vorhersehbare Bewegungsunschärfe oder gleichbleibende Intensität von Einzelbild zu Einzelbild für die Schwellenwertbildung benötigt. Das Zurücklesen der aktuellen Belichtung – ob sie nun von der Schleife oder von der Anwendung gesetzt wurde – ist ein separater Aufruf:

us = csi0.exposure_us()

Ein Aufruf von auto_exposure() mit True und ohne Belichtungswert gibt die Kontrolle wieder an die Schleife zurück.

4.17.3. Verstärkung

Die Verstärkung ist der Verstärker, der auf die Pixelspannung angewendet wird, bevor sie den ADC erreicht, in Dezibel. Wie bei der Belichtung startet der Treiber mit eingeschalteter Auto-Verstärkungsschleife. Zwei Muster kommen häufig vor. Das Begrenzen der Obergrenze erlaubt es der Schleife, sich an die Beleuchtung anzupassen, hindert sie aber daran, Rauschen in dunklen Szenen unbegrenzt zu verstärken:

csi0.auto_gain(True, gain_db_ceiling=16)

Das Fixieren einer festen Verstärkung ist der richtige Schritt, wenn die Anwendung auch die Belichtung fixiert – Verstärkungsstabilität ist wichtig für Anwendungen, die Pixelwerte von Einzelbild zu Einzelbild vergleichen, wie etwa Farbverfolgung:

csi0.auto_gain(False, gain_db=0)

Die aktuelle Verstärkung wird über gain_db() zurückgelesen. Immer wenn die Anwendung die Auto-Verstärkung deaktiviert, sollte sie auch den Auto-Weißabgleich und die Auto-Belichtung deaktivieren – andernfalls werden die weiterhin aktiven Regelschleifen das Bild auf eine Weise verändern, die die feste Verstärkung zunichtemacht.

4.17.4. Weißabgleich

Der Weißabgleich ist die kanalweise Verstärkung, die der ISP auf die roten, grünen und blauen Kanäle nach der Debayer-Stufe anwendet, damit ein weißes Objekt unter jeder Lichtfarbe weiß aussieht. Die Auto-Weißabgleichsschleife berechnet diese drei Verstärkungen aus den regionsweisen Statistiken, die der ISP bei jedem Einzelbild erfasst, und wendet sie beim nächsten Einzelbild an.

Die meisten Anwendungen lassen die Schleife laufen. Farbverfolgung ist die häufige Ausnahme – die Verstärkungen sind genau das, was die Schleife verschieben wird, um einem farbigen Objekt zu folgen. Wenn die Anwendung also versucht, einen roten Blob zu finden, dimmt die Schleife stillschweigend den roten Kanal und der Blob passt nicht mehr. Das Sperren der Schleife behebt das:

csi0.auto_whitebal(False)

Übergeben Sie ein explizites (r, g, b)-Tupel in Dezibel für eine reproduzierbare Farbkalibrierung – dieselben Verstärkungen über Platinen und Sitzungen hinweg:

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

Die aktuellen Verstärkungen werden als Tupel über rgb_gain_db() zurückgelesen.

4.17.5. Bildraten-Begrenzung

Sensoren laufen standardmäßig mit ihrer nativen Bildrate – 30 bis 60 Bilder pro Sekunde bei den meisten Bauteilen, deutlich höher bei den Hochgeschwindigkeitssensoren, wenn die framesize klein genug ist. Das Begrenzen der Rate erlaubt es der Anwendung, die Kamera auf das zu drosseln, womit die nachgelagerte Verarbeitung Schritt halten kann:

csi0.framerate(15)

Bei Sensoren, die eine Hardware-Ratensteuerung unterstützen, verlängert der Aufruf auch das Belichtungsbudget pro Einzelbild, was bei schwachem Licht helfen kann; bei den anderen überspringt der Treiber die zusätzlichen Einzelbilder einfach auf Framebuffer-Ebene.

4.17.6. Testmuster

Das Farbbalken-Testmuster ist in den meisten Sensoren eingebaut und nützlich, um ein Bildgebungs-Problem von einem Ausgabe-Problem zu trennen. Das Einschalten umgeht das Fotodioden-Array und sendet ein festes Muster über denselben Pixeldatenpfad:

csi0.colorbar(True)

Wenn das Testmuster richtig aussieht, das Live-Bild aber nicht, liegt der Fehler in der Optik oder im analogen Frontend des Sensors; wenn sogar das Testmuster beschädigt ist, liegt das Problem irgendwo auf dem Pixeldatenbus oder in der Konfiguration von pixformat() / framesize(). Übergeben Sie False, um zum Live-Bild zurückzukehren.

Siehe csi.CSI für die vollständige API, einschließlich der sensorspezifischen ioctl()-Befehle, die Steuerungen freigeben, die für bestimmte Sensorfamilien einzigartig sind.