sensor_manual_gain_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 manuale del guadagno del sensore
#
# Questo esempio mostra come controllare
# manualmente il guadagno rispetto a lasciare che il controllo automatico del guadagno lo 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 il guadagno. Prova 10.0/0/0.1/ecc.
GAIN_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 guadagno iniziale per confronto.
print("Initial gain == %f db" % csi0.gain_db())
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 dell'esposizione e il bilanciamento automatico del bianco
# altrimenti modificheranno l'esposizione dell'immagine annullando qualsiasi impostazione di guadagno
# che è stata configurata...
csi0.auto_exposure(False)
csi0.auto_whitebal(False)
# È necessario lasciare che le impostazioni sopra abbiano effetto...
csi0.snapshot(time=500)
current_gain_in_decibels = csi0.gain_db()
print("Current Gain == %f db" % current_gain_in_decibels)
# Il controllo automatico del guadagno (AGC) è abilitato per impostazione predefinita. Chiamando la funzione sottostante
# si disabilita il controllo automatico del guadagno del sensore. L'argomento aggiuntivo "gain_db"
# sovrascrive quindi il valore di guadagno automatico dopo che l'AGC è stato disabilitato.
csi0.auto_gain(False, gain_db=current_gain_in_decibels * GAIN_SCALE)
print("New gain == %f db" % csi0.gain_db())
# csi0.gain_db() restituisce i decibel esatti di guadagno del sensore della fotocamera.
# Tuttavia questo numero potrebbe essere diverso da quello impostato perché
# il codice del sensore converte il guadagno in un valore di guadagno piccolo e uno grande, che
# non sono in grado di accettare tutti i valori possibili...
# Se si desidera riattivare il guadagno automatico: csi0.auto_gain(True)
# Nota che il sensore della fotocamera modificherà quindi il guadagno come preferisce.
# Eseguendo: csi0.auto_gain(False)
# Disabilita semplicemente l'aggiornamento del valore di guadagno, ma non modifica il guadagno
# 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.