sensor_manual_gain_control.py
# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# センサー手動ゲイン制御
#
# この例では、カメラセンサーの
# ゲインを、自動ゲイン制御に任せる代わりに手動で制御します。
# ゲイン制御と露光制御の違いは何でしょうか?
#
# 露光時間を長くすると、より多くの
# 光をカメラに取り込めます。これによりS/N比が最良になります。
# 一般的には露光時間を長くしたいところですが……露光時間を
# 長くすると、最大フレームレートが低下し、
# また画像内で何かが動くと、露光時間が長いほど
# ブレが大きくなります。ゲイン制御を使うと、アナログ・デジタル乗数によって
# ピクセルごとの出力を増加させることができますが……ノイズも
# 増幅されます。そのため、できる限り露光時間を増やしてから、
# 残りをゲイン制御で補うのが最善です。
import csi
import time
# この値を変更してゲインを調整してください。10.0/0/0.1などを試してみてください。
GAIN_SCALE = 1.0
csi0 = csi.CSI()
csi0.reset() # センサーをリセットして初期化します。
csi0.pixformat(csi.RGB565) # ピクセルフォーマットをRGB565(またはGRAYSCALE)に設定します
csi0.framesize(csi.QVGA) # フレームサイズをQVGA(320x240)に設定します
# 比較のため、初期のゲインを表示します。
print("Initial gain == %f db" % csi0.gain_db())
csi0.snapshot(time=2000) # 設定が反映されるまで待ちます。
clock = time.clock() # FPSを計測するためのclockオブジェクトを作成します。
# 自動露光制御と自動ホワイトバランスをオフにする必要があります。
# そうしないと、設定したゲインを打ち消すように画像の露光が変更されてしまいます
# (設定した内容が反映されなくなります)。
csi0.auto_exposure(False)
csi0.auto_whitebal(False)
# 上記の設定が反映されるまで待つ必要があります……
csi0.snapshot(time=500)
current_gain_in_decibels = csi0.gain_db()
print("Current Gain == %f db" % current_gain_in_decibels)
# 自動ゲイン制御(AGC)はデフォルトで有効です。以下の関数を呼び出すと
# センサーの自動ゲイン制御が無効になります。さらに"gain_db"引数を指定すると、
# AGCが無効化された後の自動ゲイン値を上書きできます。
csi0.auto_gain(False, gain_db=current_gain_in_decibels * GAIN_SCALE)
print("New gain == %f db" % csi0.gain_db())
# csi0.gain_db()は、カメラセンサーの正確なゲイン(デシベル)を返します。
# ただし、これは指定した値とは異なる場合があります。これは
# センサーのコードがゲインを小ゲイン値と大ゲイン値に変換する際、
# すべての値に対応できるわけではないためです……
# 自動ゲインを再度有効にしたい場合は: csi0.auto_gain(True) としてください
# この場合、カメラセンサーは自身の判断でゲインを変更するようになります。
# csi0.auto_gain(False) を実行すると、
# ゲイン値の更新が無効になるだけで、ゲイン
# 露光値自体は変更されません。
while True:
clock.tick() # FPSクロックを更新します。
img = csi0.snapshot() # 画像を撮影して返します。
print(clock.fps()) # 注意: OpenMV CamはIDEに接続されている間、
# 速度が約半分になります。切断すればFPSは向上します。