sensor_exposure_control.py
# Este trabalho está licenciado sob a licença MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Todos os direitos reservados.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Controle de Exposição do Sensor
#
# Este exemplo demonstra como controlar a
# exposição do sensor da câmera manualmente em vez de deixar o controle de exposição automática atuar.
# Qual é a diferença entre controle de ganho e controle de exposição?
#
# Bem, ao aumentar o tempo de exposição da imagem, você recebe mais
# luz na câmera. Isso oferece a melhor relação sinal-ruído. Você
# geralmente sempre quer aumentar o tempo de exposição... exceto que, quando você
# aumenta o tempo de exposição, diminui a taxa de quadros máxima possível
# e se algo se move na imagem, ele começará a borrar mais com um
# tempo de exposição maior. O controle de ganho permite aumentar a saída por
# pixel usando multiplicadores analógicos e digitais... no entanto, também amplifica
# o ruído. Portanto, é melhor deixar a exposição aumentar o máximo possível
# e depois usar o controle de ganho para compensar o restante.
import csi
import time
# Altere este valor para ajustar a exposição. Tente 10.0/0.1/etc.
EXPOSURE_TIME_SCALE = 1.0
csi0 = csi.CSI()
csi0.reset() # Reinicia e inicializa o sensor.
csi0.pixformat(csi.RGB565) # Define o formato de pixel para RGB565 (ou GRAYSCALE)
csi0.framesize(csi.QVGA) # Define o tamanho do frame para QVGA (320x240)
# Imprime o tempo de exposição inicial para comparação.
print("Initial exposure == %d" % csi0.exposure_us())
csi0.snapshot(time=2000) # Aguarda as configurações fazerem efeito.
clock = time.clock() # Cria um objeto clock para rastrear o FPS.
# Você precisa desativar o controle automático de ganho e o balanço de branco automático,
# caso contrário eles alterarão os ganhos da imagem, desfazendo quaisquer configurações de exposição
# que você definir...
csi0.auto_gain(False)
csi0.auto_whitebal(False)
# É necessário aguardar as configurações acima entrarem em efeito...
csi0.snapshot(time=500)
current_exposure_time_in_microseconds = csi0.exposure_us()
print("Current Exposure == %d" % current_exposure_time_in_microseconds)
# O controle automático de exposição (AEC) está ativado por padrão. Chamar a função abaixo
# desativa o controle automático de exposição do sensor. O argumento adicional "exposure_us"
# então sobrepõe o valor de exposição automática após o AEC ser desativado.
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() retorna o tempo de exposição exato do sensor da câmera
# em microssegundos. No entanto, isso pode ser um número diferente do que foi
# comandado, porque o código do sensor converte o tempo de exposição em microssegundos
# para um tempo de linha/pixel/clock que não corresponde perfeitamente a microssegundos...
# Se você quiser reativar a exposição automática, faça: csi0.auto_exposure(True)
# Note que o sensor da câmera então alterará o tempo de exposição como quiser.
# Fazendo: csi0.auto_exposure(False)
# Apenas desativa a atualização do valor de exposição, mas não altera o
# valor de exposição que o sensor da câmera determinou ser adequado.
while True:
clock.tick() # Atualiza o clock de FPS.
img = csi0.snapshot() # Tira uma foto e retorna a imagem.
print(clock.fps()) # NOTA: A OpenMV Cam roda cerca de metade da velocidade quando conectada
# ao IDE. O FPS deve aumentar assim que desconectada.