sensor_exposure_control.py
# Esta obra está licenciada bajo la licencia MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Todos los derechos reservados.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Control de exposición del sensor
#
# Este ejemplo muestra cómo controlar
# manualmente la exposición del sensor de la cámara en lugar de dejar que se ejecute el control automático de exposición.
# ¿Cuál es la diferencia entre el control de ganancia y el de exposición?
#
# Bueno, al aumentar el tiempo de exposición de la imagen, se obtiene más
# luz en la cámara. Esto le da la mejor relación señal-ruido. Usted
# en general siempre querrá aumentar el tiempo de exposición... excepto que, al
# aumentar el tiempo de exposición, disminuye la velocidad de fotogramas máxima posible
# y si algo se mueve en la imagen, comenzará a desenfocarse más con un
# tiempo de exposición más alto. El control de ganancia le permite aumentar la salida por
# píxel usando multiplicadores analógicos y digitales... sin embargo, también amplifica
# el ruido. Por lo tanto, es mejor dejar que la exposición aumente tanto como sea posible
# y luego usar el control de ganancia para compensar el resto.
import csi
import time
# Cambie este valor para ajustar la exposición. Pruebe 10.0/0.1/etc.
EXPOSURE_TIME_SCALE = 1.0
csi0 = csi.CSI()
csi0.reset() # Restablecer e inicializar el sensor.
csi0.pixformat(csi.RGB565) # Establecer el formato de píxel a RGB565 (o GRAYSCALE)
csi0.framesize(csi.QVGA) # Establecer el tamaño de fotograma a QVGA (320x240)
# Imprimir el tiempo de exposición inicial para comparación.
print("Initial exposure == %d" % csi0.exposure_us())
csi0.snapshot(time=2000) # Esperar a que los ajustes surtan efecto.
clock = time.clock() # Crear un objeto clock para registrar los FPS.
# Debe desactivar el control automático de ganancia y el balance de blancos automático
# de lo contrario, cambiarán las ganancias de la imagen y anularán cualquier ajuste de exposición
# que haya establecido...
csi0.auto_gain(False)
csi0.auto_whitebal(False)
# Es necesario esperar a que los ajustes anteriores surtan efecto...
csi0.snapshot(time=500)
current_exposure_time_in_microseconds = csi0.exposure_us()
print("Current Exposure == %d" % current_exposure_time_in_microseconds)
# El control automático de exposición (AEC) está activado por defecto. Llamar a la siguiente función
# desactiva el control automático de exposición del sensor. El argumento adicional "exposure_us"
# sobrescribe entonces el valor de exposición automática después de desactivar el AEC.
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() devuelve el tiempo de exposición exacto del sensor de la cámara
# en microsegundos. Sin embargo, este puede ser un número diferente al que se
# solicitó, porque el código del sensor convierte el tiempo de exposición en microsegundos
# a un tiempo de fila/píxel/reloj que no coincide perfectamente con los microsegundos...
# Si desea volver a activar la exposición automática, haga: csi0.auto_exposure(True)
# Tenga en cuenta que el sensor de la cámara entonces cambiará el tiempo de exposición como le parezca.
# Haciendo: csi0.auto_exposure(False)
# Solo desactiva la actualización del valor de exposición, pero no cambia la exposición
# valor que el sensor de la cámara determinó que era correcto.
while True:
clock.tick() # Actualizar el reloj de FPS.
img = csi0.snapshot() # Tomar una foto y devolver la imagen.
print(clock.fps()) # Nota: la OpenMV Cam funciona a aproximadamente la mitad de velocidad cuando está conectada
# al IDE. Los FPS deberían aumentar una vez desconectada.