sensor_manual_gain_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 manual de ganancia del sensor
#
# Este ejemplo muestra cómo controlar
# ganancia manualmente en lugar de dejar que se ejecute el control automático de ganancia.
# ¿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 ganancia. Pruebe 10.0/0/0.1/etc.
GAIN_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)
# Muestre la ganancia inicial para comparar.
print("Initial gain == %f db" % csi0.gain_db())
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 exposición y el balance de blancos automático
# de lo contrario, cambiarán la exposición de la imagen para deshacer cualquier ajuste de ganancia
# que haya establecido...
csi0.auto_exposure(False)
csi0.auto_whitebal(False)
# Es necesario esperar a que los ajustes anteriores surtan efecto...
csi0.snapshot(time=500)
current_gain_in_decibels = csi0.gain_db()
print("Current Gain == %f db" % current_gain_in_decibels)
# El control automático de ganancia (AGC) está activado de forma predeterminada. Llamar a la siguiente función
# desactiva el control automático de ganancia del sensor. El argumento adicional "gain_db"
# sobrescribe entonces el valor de ganancia automática después de desactivar el AGC.
csi0.auto_gain(False, gain_db=current_gain_in_decibels * GAIN_SCALE)
print("New gain == %f db" % csi0.gain_db())
# csi0.gain_db() devuelve los decibelios exactos de ganancia del sensor de la cámara.
# Sin embargo, este puede ser un número distinto al indicado, porque
# el código del sensor convierte la ganancia en un valor de ganancia pequeño y otro grande, los cuales
# no pueden aceptar todos los valores posibles...
# Si desea volver a activar la ganancia automática, ejecute: csi0.auto_gain(True)
# Tenga en cuenta que el sensor de la cámara cambiará entonces la ganancia como prefiera.
# Haciendo: csi0.auto_gain(False)
# Solo desactiva la actualización del valor de ganancia, pero no cambia la ganancia
# 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.