sensor_exposure_control.py
# Ce travail est publié sous licence MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tous droits réservés.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Contrôle de l'exposition du capteur
#
# Cet exemple présente comment contrôler
# manuellement l'exposition du capteur de la caméra plutôt que de laisser le contrôle d'exposition automatique s'exécuter.
# Quelle est la différence entre le contrôle du gain et celui de l'exposition ?
#
# En augmentant le temps d'exposition de l'image, vous obtenez plus de
# lumière sur la caméra. Cela vous donne le meilleur rapport signal/bruit. Vous
# voulez en général toujours augmenter le temps d'exposition... sauf que, lorsque vous
# augmentez le temps d'exposition, vous diminuez la fréquence d'images maximale possible
# et si quelque chose bouge dans l'image, celle-ci commencera à devenir plus floue avec un
# temps d'exposition plus élevé. Le contrôle du gain permet d'augmenter la sortie par
# pixel à l'aide de multiplicateurs analogiques et numériques... cependant, cela amplifie
# également le bruit. Il est donc préférable de laisser l'exposition augmenter autant que possible
# puis d'utiliser le contrôle du gain pour combler le reste.
import csi
import time
# Modifiez cette valeur pour ajuster l'exposition. Essayez 10.0/0.1/etc.
EXPOSURE_TIME_SCALE = 1.0
csi0 = csi.CSI()
csi0.reset() # Réinitialiser et initialiser le capteur.
csi0.pixformat(csi.RGB565) # Définir le format de pixel sur RGB565 (ou GRAYSCALE)
csi0.framesize(csi.QVGA) # Définir la taille de l'image sur QVGA (320x240)
# Affichez le temps d'exposition initial à des fins de comparaison.
print("Initial exposure == %d" % csi0.exposure_us())
csi0.snapshot(time=2000) # Attendre que les réglages prennent effet.
clock = time.clock() # Créer un objet horloge pour suivre le FPS.
# Vous devez désactiver le contrôle automatique du gain et de la balance des blancs automatique
# sinon ils modifieront les gains de l'image pour annuler tout réglage d'exposition
# que vous avez mis en place...
csi0.auto_gain(False)
csi0.auto_whitebal(False)
# Il faut laisser le temps aux réglages ci-dessus de prendre effet...
csi0.snapshot(time=500)
current_exposure_time_in_microseconds = csi0.exposure_us()
print("Current Exposure == %d" % current_exposure_time_in_microseconds)
# Le contrôle d'exposition automatique (AEC) est activé par défaut. Appeler la fonction ci-dessous
# désactive le contrôle d'exposition automatique du capteur. L'argument supplémentaire "exposure_us"
# remplace ensuite la valeur d'exposition automatique une fois l'AEC désactivé.
csi0.auto_exposure(
False, exposure_us=int(current_exposure_time_in_microseconds * EXPOSURE_TIME_SCALE)
)
print("New exposure == %d" % csi0.exposure_us())
# csi0.exposure_us() renvoie le temps d'exposition exact du capteur de la caméra
# en microsecondes. Cependant, ce nombre peut être différent de celui qui a été
# demandé, car le code du capteur convertit le temps d'exposition en microsecondes
# en un temps de ligne/pixel/horloge qui ne correspond pas parfaitement aux microsecondes...
# Si vous souhaitez réactiver l'exposition automatique, faites : csi0.auto_exposure(True)
# Notez que le capteur de la caméra modifiera alors le temps d'exposition comme il l'entend.
# En faisant : csi0.auto_exposure(False)
# Désactive simplement la mise à jour de la valeur d'exposition mais ne modifie pas l'exposition
# que le capteur de la caméra a déterminée comme étant bonne.
while True:
clock.tick() # Mettre à jour l'horloge FPS.
img = csi0.snapshot() # Prendre une photo et renvoyer l'image.
print(clock.fps()) # Remarque : l'OpenMV Cam tourne environ deux fois moins vite lorsqu'elle est connectée
# à l'IDE. Le FPS devrait augmenter une fois déconnectée.