sensor_exposure_control.py
# Questo lavoro è concesso in licenza MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tutti i diritti riservati.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Controllo dell'esposizione del sensore
#
# Questo esempio mostra come controllare il sensore della fotocamera
# manualmente l'esposizione rispetto a lasciare che il controllo automatico dell'esposizione la gestisca.
# Qual è la differenza tra il controllo del guadagno e quello dell'esposizione?
#
# Aumentando il tempo di esposizione dell'immagine si ottiene più
# luce sulla fotocamera. Questo garantisce il miglior rapporto segnale/rumore. In
# generale si vuole sempre aumentare il tempo di esposizione... tranne quando
# aumentando il tempo di esposizione si riduce il framerate massimo possibile
# e se qualcosa si muove nell'immagine inizierà a sfocarsi maggiormente con un
# tempo di esposizione più alto. Il controllo del guadagno consente di aumentare l'output per
# pixel usando moltiplicatori analogici e digitali... tuttavia amplifica anche il
# rumore. Quindi è meglio lasciare che l'esposizione aumenti il più possibile
# e poi usare il controllo del guadagno per recuperare il resto.
import csi
import time
# Modifica questo valore per regolare l'esposizione. Prova 10.0/0.1/ecc.
EXPOSURE_TIME_SCALE = 1.0
csi0 = csi.CSI()
csi0.reset() # Resetta e inizializza il sensore.
csi0.pixformat(csi.RGB565) # Imposta il formato pixel su RGB565 (o GRAYSCALE)
csi0.framesize(csi.QVGA) # Imposta la dimensione del fotogramma su QVGA (320x240)
# Stampa il tempo di esposizione iniziale per confronto.
print("Initial exposure == %d" % csi0.exposure_us())
csi0.snapshot(time=2000) # Attendi che le impostazioni abbiano effetto.
clock = time.clock() # Crea un oggetto clock per tracciare gli FPS.
# È necessario disattivare il controllo automatico del guadagno e il bilanciamento automatico del bianco
# altrimenti modificheranno i guadagni dell'immagine annullando qualsiasi impostazione di esposizione
# che è stata configurata...
csi0.auto_gain(False)
csi0.auto_whitebal(False)
# È necessario lasciare che le impostazioni sopra abbiano effetto...
csi0.snapshot(time=500)
current_exposure_time_in_microseconds = csi0.exposure_us()
print("Current Exposure == %d" % current_exposure_time_in_microseconds)
# Il controllo automatico dell'esposizione (AEC) è abilitato per impostazione predefinita. Chiamando la funzione sottostante
# si disabilita il controllo automatico dell'esposizione del sensore. L'argomento aggiuntivo "exposure_us"
# sovrascrive quindi il valore di esposizione automatica dopo che l'AEC è stato disabilitato.
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() restituisce il tempo di esposizione esatto del sensore della fotocamera
# in microsecondi. Tuttavia questo numero potrebbe essere diverso da quello
# impostato, perché il codice del sensore converte il tempo di esposizione in microsecondi
# in un tempo di riga/pixel/clock che non corrisponde perfettamente ai microsecondi...
# Se si desidera riattivare l'esposizione automatica: csi0.auto_exposure(True)
# Nota che il sensore della fotocamera modificherà quindi il tempo di esposizione come preferisce.
# Eseguendo: csi0.auto_exposure(False)
# Disabilita semplicemente l'aggiornamento del valore di esposizione, ma non modifica l'esposizione
# il valore che il sensore della fotocamera ha determinato essere corretto.
while True:
clock.tick() # Aggiorna il clock degli FPS.
img = csi0.snapshot() # Scatta una foto e restituisce l'immagine.
print(clock.fps()) # Nota: OpenMV Cam funziona a circa metà velocità quando è connessa
# all'IDE. Gli FPS dovrebbero aumentare una volta disconnessa.