4.17. Réglages du capteur¶
Au-delà de pixformat() et framesize(), la classe CSI expose une poignée de commandes propres au capteur que presque toutes les applications finissent tôt ou tard par utiliser – orientation de montage, exposition, gain, balance des blancs et quelques aides au débogage. Chacune correspond directement à un concept de capteur abordé plus haut ; l’API fournit simplement une poignée Python pour l’écriture de registre que le pilote effectue en arrière-plan.
Toutes les méthodes ci-dessous agissent sur le capteur sous-jacent. Elles transmettent toutes des écritures de registre sur le bus de commande I2C du capteur, si bien que le coût se chiffre en microsecondes et que le nouveau réglage prend effet à l’exposition suivante – généralement la prochaine snapshot().
4.17.1. Orientation¶
La caméra ne sait pas dans quel sens elle a été montée. Deux indicateurs de retournement appliqués au capteur remettent l’image dans le bon sens avant qu’aucun pixel ne quitte la puce
csi0.hmirror(True)
csi0.vflip(True)
hmirror() retourne de gauche à droite et vflip() retourne de haut en bas. Ensemble, ils couvrent les cas qui se présentent en pratique : une carte montée à l’envers (les deux indicateurs à True), une carte placée derrière un miroir à face avant argentée (hmirror seulement), ou une carte regardant une scène réfléchie depuis le dessous (vflip seulement).
Comme le retournement se produit dans la logique de lecture du capteur, il n’y a aucun coût CPU ni surcoût mémoire – la trame arrive dans le tampon d’image déjà orientée.
4.17.2. Exposition¶
L’exposition est le temps d’intégration – la durée pendant laquelle la photodiode de chaque pixel accumule de la charge avant que la ligne ne soit lue, en microsecondes. Le pilote démarre avec la boucle d’exposition automatique du capteur en marche, si bien que la caméra essaie de maintenir la valeur moyenne des pixels près d’une cible. Désactiver la boucle fixe l’exposition à une valeur choisie par l’application
csi0.auto_exposure(False, exposure_us=8000)
Une exposition fixe est le bon choix lorsque la luminosité de la scène est stable et que l’application a besoin d’un flou de mouvement prévisible ou d’une intensité constante d’une trame à l’autre pour le seuillage. Relire l’exposition actuelle – qu’elle ait été définie par la boucle ou par l’application – est un appel distinct
us = csi0.exposure_us()
Appeler auto_exposure() avec True et sans valeur d’exposition rend le contrôle à la boucle.
4.17.3. Gain¶
Le gain est l’amplificateur appliqué à la tension du pixel avant qu’elle n’atteigne l’ADC, en décibels. Comme pour l’exposition, le pilote démarre avec la boucle de gain automatique activée. Deux schémas reviennent souvent. Plafonner la limite supérieure permet à la boucle de s’adapter à l’éclairage tout en l’empêchant d’amplifier indéfiniment le bruit dans les scènes sombres
csi0.auto_gain(True, gain_db_ceiling=16)
Fixer un gain constant est la bonne approche lorsque l’application fixe aussi l’exposition – la stabilité du gain importe pour les applications qui comparent les valeurs des pixels d’une trame à l’autre, comme le suivi de couleur
csi0.auto_gain(False, gain_db=0)
Le gain actuel se relit via gain_db(). Chaque fois que l’application désactive le gain automatique, elle devrait aussi désactiver la balance des blancs automatique et l’exposition automatique – sinon les boucles de commande encore actives modifieront l’image de manières qui annulent le gain fixe.
4.17.4. Balance des blancs¶
La balance des blancs est le gain par canal que l’ISP applique aux canaux rouge, vert et bleu issus de l’étape de débayerisation afin qu’un objet blanc paraisse blanc sous n’importe quelle couleur de lumière. La boucle de balance des blancs automatique calcule ces trois gains à partir des statistiques par région que l’ISP collecte à chaque trame et les applique à la trame suivante.
La plupart des applications laissent la boucle en marche. Le suivi de couleur est l’exception courante – les gains sont aussi ce que la boucle modifiera pour poursuivre un objet coloré, donc si l’application essaie de trouver un blob rouge, la boucle atténuera discrètement le canal rouge et le blob cessera de correspondre. Verrouiller la boucle corrige cela
csi0.auto_whitebal(False)
Passez un tuple (r, g, b) explicite en décibels pour un étalonnage de couleur reproductible – les mêmes gains d’une carte à l’autre et d’une session à l’autre
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
Les gains actuels se relisent sous forme de tuple via rgb_gain_db().
4.17.5. Plafond de fréquence d’images¶
Les capteurs fonctionnent par défaut à leur fréquence d’images native – 30 à 60 images par seconde sur la plupart des composants, beaucoup plus sur les capteurs à haute vitesse lorsque la taille de trame est suffisamment petite. Plafonner la fréquence permet à l’application de bridér la caméra à ce que le traitement en aval peut suivre
csi0.framerate(15)
Sur les capteurs qui prennent en charge un contrôle matériel de la fréquence, l’appel allonge aussi le budget d’exposition par trame, ce qui peut aider en faible luminosité ; sur les autres, le pilote saute simplement les trames excédentaires au niveau du tampon d’image.
4.17.6. Mire de test¶
La mire de test à barres de couleur est intégrée à la plupart des capteurs et utile pour distinguer un problème d”imagerie d’un problème de sortie. L’activer contourne la matrice de photodiodes et envoie une mire fixe sur le même chemin de données pixel
csi0.colorbar(True)
Si la mire de test semble correcte mais que l’image en direct ne l’est pas, le défaut se situe dans l’optique ou dans l’étage analogique d’entrée du capteur ; si même la mire de test est corrompue, le problème se trouve quelque part sur le bus de données pixel ou dans la configuration pixformat() / framesize(). Passez False pour revenir à l’image en direct.
Voir csi.CSI pour l’API complète, y compris les commandes ioctl() propres au capteur qui exposent des contrôles spécifiques à certaines familles de capteurs.