Control del sensor IA
Control automático de ganancia¶
# Control automático de ganancia
#
# Este ejemplo muestra cómo controlar la ganancia del sensor utilizando el algoritmo de control
# automático de ganancia.
# ¿Cuál es la diferencia entre el control de ganancia y el control de exposición?
#
# Bueno, al aumentar el tiempo de exposición de la imagen, se obtiene más luz en la cámara. Esto
# proporciona la mejor relación señal-ruido. En general, siempre es conveniente aumentar el tiempo
# de exposición... excepto que, al aumentar el tiempo de exposición, se reduce la velocidad máxima
# posible de fotogramas y, si algo se mueve en la imagen, comenzará a desenfocarse más con un
# tiempo de exposición mayor. El control de ganancia permite aumentar la salida por píxel
# utilizando multiplicadores analógicos y digitales... sin embargo, también amplifica el ruido.
# Por lo tanto, lo mejor es dejar que la exposición aumente tanto como sea posible y luego utilizar
# el control de ganancia para compensar cualquier diferencia restante.
# Podemos lograr lo anterior estableciendo un límite máximo de ganancia en el algoritmo de control
# automático de ganancia. Una vez establecido, el algoritmo tendrá que aumentar el tiempo de
# exposición para satisfacer cualquier necesidad de ganancia, en lugar de utilizar la ganancia para
# hacerlo. Sin embargo, esto tiene el inconveniente de que el tiempo de exposición varía más cuando
# cambia la iluminación, en comparación con una exposición constante y un cambio en la ganancia.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar sensor
sensor.set_pixformat(sensor.RGB565) # Formato de salid RGB565 (o GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Tamaño de salida de la cámara QQVGA (320x240)
# El límite máximo de ganancia en db es de aproximadamente 24 db para el sensor OV7725
sensor.set_auto_gain(True, gain_db_ceiling = 16.0) # Ganancia predeterminada
# ¡Atención! Si estableces el límite máximo de ganancia en un valor bajo sin ajustar el valor
# objetivo del control de exposición, obtendrás mucha oscilación del control de exposición si
# está activado.
sensor.skip_frames(time = 2000) # Espera a que los ajustes surtan efecto
clock = time.clock() # Crea un objeto reloj (clock) para realizar un seguimiento de los FPS
while(True):
clock.tick() # actualiza clock y por tanto FPS
img = sensor.snapshot() # Toma una foto y devuelve la imagen
print("FPS %f, Ganancia %f dB, Exposicion %d us" % \
(clock.fps(), sensor.get_gain_db(), sensor.get_exposure_us()))
Descargar el programa Control_auto_ganancia.py
Control de exposicion¶
# Control de exposicion
#
# 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 de exposición automático.
# ¿Cuál es la diferencia entre el control de ganancia y el control de exposición?
#
# Bueno, al aumentar el tiempo de exposición de la imagen, se obtiene más luz en la cámara.
# Esto proporciona la mejor relación señal-ruido. En general, siempre es conveniente aumentar
# el tiempo de exposición... excepto que, al aumentar el tiempo de exposición, se reduce la
# velocidad máxima posible de fotogramas 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 permite aumentar la salida por
# píxel utilizando multiplicadores analógicos y digitales... sin embargo, también amplifica el
# ruido. Por lo tanto, lo mejor es dejar que la exposición aumente tanto como sea posible y luego
# utilizar el control de ganancia para compensar cualquier diferencia restante.
import sensor, image, time
# Cambia este valor para ajustar la exposición. Prueba con 10,0/0,1/etc.
EXPOSURE_TIME_SCALE = 1.0
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (o GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Tamaño de salida de la cámara QVGA (320x240)
# Imprime el tiempo de exposición inicial para compararlo
print("Exposicion inicial == %d" % sensor.get_exposure_us())
sensor.skip_frames(time = 2000) # Espera a que los ajustes surtan efecto
clock = time.clock() # Crea un objeto reloj (clock) para realizar un seguimiento
# de los FPS
# Debes desactivar el control automático de ganancia y el balance de blancos automático, ya que de
# lo contrario modificarán la ganancia de la imagen y anularán cualquier ajuste de exposición que
# haya establecido...
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
# Es necesario dejar que los ajustes anteriores se realicen...
sensor.skip_frames(time = 500)
current_exposure_time_in_microseconds = sensor.get_exposure_us()
print("Exposicion actual == %d" % current_exposure_time_in_microseconds)
# El control automático de exposición (AEC) está habilitado de forma predeterminada. Al llamar a
# la siguiente función se deshabilita el control automático de exposición del sensor. El argumento
# adicional 'exposure_us' anula el valor de exposición automática después de deshabilitar el AEC.
sensor.set_auto_exposure(False, \
exposure_us = int(current_exposure_time_in_microseconds * EXPOSURE_TIME_SCALE))
print("Nueva exposicion == %d" % sensor.get_exposure_us())
# sensor.get_exposure_us() devuelve el tiempo de exposición exacto del sensor de la cámara en
# microsegundos. Sin embargo, este valor puede diferir del valor solicitado, ya que el código
# del sensor convierte el tiempo de exposición en microsegundos a un tiempo de row/pixel/clock
# que no coincide perfectamente con los microsegundos...
# Si deseas volver a activar la exposición automática, haz lo siguiente: sensor.set_auto_exposure(True)
# Ten en cuenta que el sensor de la cámara cambiará el tiempo de exposición.
# Al hacer lo siguiente: sensor.set_auto_exposure(False) Solo se desactiva la actualización del
# valor de exposición, pero no se cambia el valor de exposición que el sensor de la cámara
# determinó que era adecuado.
while(True):
clock.tick() # actualiza clock y por tanto FPS
img = sensor.snapshot() # Toma una foto y devuelve la imagen
print(clock.fps())
Descargar el programa control_expo.py
Espejo horizontal¶
# Espejo horizontal
#
# Este ejemplo muestra el reflejo horizontal de la imagen
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (o GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Tamaño de salida de la cámara QVGA (320x240)
sensor.skip_frames(time = 2000) # Espera a que los ajustes surtan efecto
clock = time.clock() # Crea un objeto clock (reloj) para realizar un seguimiento
# de los FPS
# Cambia a False para deshacer el espejado
sensor.set_hmirror(True)
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
print(clock.fps())
Descargar el programa Espejo_horizontal.py
Control manual del balance de blancos¶
# Control manual del balance de blancos
#
# Este ejemplo muestra cómo controlar manualmente la ganancia del balance de blancos del sensor
# en lugar de dejar que se ejecute el control AWB.
# El balance de blancos se consigue ajustando los valores de ganancia R/G/B de manera que el color
# medio de la imagen sea gris. El algoritmo de balance de blancos automático (AWB) lo hace por ti,
# pero normalmente obtiene un resultado diferente cada vez que enciende la cámara, lo que dificulta
# conseguir los ajustes de seguimiento del color correctos. Al registrar manualmente los valores de
# ganancia que desees y luego forzarlos al sensor al iniciar la cámara, puedes controlar los colores
# que ve la cámara.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (o GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Tamaño de salida de la cámara QVGA (320x240)
sensor.skip_frames(time = 2000) # Espera a que los ajustes surtan efecto
clock = time.clock() # Crea un objeto clock (reloj) para realizar un seguimiento
# de los FPS
# Aquí puedes controlar las ganancias del balance de blancos. El primer valor es la ganancia
# R en db, seguido de la ganancia G en db y, a continuación, la ganancia B en db.
#
# Descomenta la siguiente línea con los valores de ganancia que desees
sensor.set_auto_whitebal(False, rgb_gain_db = (0.0, 0.0, 0.0))
# Nota: Si se introduce (0.0, 0.0, 0.0) para la ganancia, el resultado será cercano a cero. No
# esperes que el valor exacto introducido sea igual al valor resultante.
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
print(clock.fps(), \
sensor.get_rgb_gain_db()) # Imprime las ganancias RGB actuales de AWB
Descargar el programa Control_manual_balance_blancos.py
Control de giro vertical¶
# Control de giro vertical
#
# Este ejemplo muestra cómo controlar si se puede voltear verticalmente la imagen.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (o GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Tamaño de salida de la cámara QVGA (320x240)
sensor.skip_frames(time = 2000) # Espera a que los ajustes surtan efecto
clock = time.clock() # Crea un objeto clock (reloj) para realizar un seguimiento
# de los FPS
# Cambia a False para deshacer el giro
sensor.set_vflip(True)
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
print(clock.fps())
Descargar el programa Control_giro_vertical.py
Control manual de ganancia¶
# Control manual de ganancia
#
# Este ejemplo muestra cómo controlar manualmente la ganancia del sensor 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 control de exposición?
#
# Bueno, al aumentar el tiempo de exposición de la imagen, se obtiene más luz en la cámara. Esto
# proporciona la mejor relación señal-ruido. En general, siempre es conveniente aumentar el tiempo
# de exposición... excepto que, al aumentar el tiempo de exposición, se reduce la velocidad máxima
# posible de fotogramas y, si algo se mueve en la imagen, comenzará a desenfocarse más con un
# tiempo de exposición mayor. El control de ganancia permite aumentar la salida por píxel
# utilizando multiplicadores analógicos y digitales... sin embargo, también amplifica el ruido.
# Por lo tanto, lo mejor es dejar que la exposición aumente tanto como sea posible y luego utilizar
# el control de ganancia para compensar cualquier diferencia restante.
# Podemos lograr lo anterior estableciendo un límite máximo de ganancia en el algoritmo de control
# automático de ganancia. Una vez establecido, el algoritmo tendrá que aumentar el tiempo de
# exposición para satisfacer cualquier necesidad de ganancia, en lugar de utilizar la ganancia para
# hacerlo. Sin embargo, esto tiene el inconveniente de que el tiempo de exposición varía más cuando
# cambia la iluminación, en comparación con una exposición constante y un cambio en la ganancia.
import sensor, image, time
# Cambia este valor para ajustar la ganancia. Prueba con 10,0/0/0,1/etc.
GAIN_SCALE = 1.0
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (o GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Tamaño de salida de la cámara QVGA (320x240)
# Imprime la ganancia inicial para compararla
print("Ganancia inicial == %f db" % sensor.get_gain_db())
sensor.skip_frames(time = 2000) # Espera a que los ajustes surtan efecto
clock = time.clock() # Crea un objeto clock (reloj) para realizar un seguimiento
# de los FPS
# Debea desactivar el control automático de exposición y el balance de blancos automático, ya
# que de lo contrario modificarán la exposición de la imagen y anularán cualquier ajuste de
# ganancia que haya establecido...
sensor.set_auto_exposure(False)
sensor.set_auto_whitebal(False)
# Es necesario dejar que los ajustes anteriores se realicen...
sensor.skip_frames(time = 500)
current_gain_in_decibels = sensor.get_gain_db()
print("Ganancia actual == %f db" % current_gain_in_decibels)
# El control automático de ganancia (AGC) está habilitado de forma predeterminada. Al llamar a
# la siguiente función se deshabilita el control automático de ganancia del sensor. El argumento
# adicional 'gain_db' anula el valor de ganancia automática después de deshabilitar el AGC
sensor.set_auto_gain(False, \
gain_db = current_gain_in_decibels * GAIN_SCALE)
print("Nueva ganancia == %f db" % sensor.get_gain_db())
# sensor.get_gain_db() devuelve los decibelios exactos de ganancia del sensor
# Sin embargo, este número puede ser diferente al que se ordenó porque el código del sensor
# convierte la ganancia en un valor de ganancia pequeño y grande que no puede aceptar todos
# los valores posibles...
# Si deseas volver a activar la ganancia automática, haz lo siguiente: sensor.set_auto_gain(True)
# Ten en cuenta que el sensor cambiará la ganancia como desees.
# Al hacer lo siguiente: sensor.set_auto_gain(False)
# Solo se desactiva la actualización del valor de ganancia, pero no se cambia el valor de ganancia
# que el sensor determinó que era adecuado.
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
print(clock.fps())