プロパティ設定におけるゲイン・露光時間の調整方法
概要
ゲインと露光時間は、カメラの画像の明るさを制御するための重要な設定項目です。 特に、照明条件が一定でない場合や、特定の被写体の明るさを強調したい場合に有効です。ゲインはイメージセンサのシグナルを増幅し、露光時間はイメージセンサが光を集める時間を制御します。これらを適切に設定することで、明るさ、コントラスト、ノイズなどの画像品質を最適化できます。しかし、ゲインや露光時間の自動設定によって連続した画像間で明るさが一定でなくなる場合があり、設定状況によっては画像解析の精度が低下する可能性があるので注意が必要です。
出力結果
プログラム全体
#解説1
import cv2
#解説2
# カメラのビデオキャプチャを開始
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#解説3
# ゲインをマニュアルモードに設定
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0)
# 0 = Manual Mode, 1= Auto Mode
print(cap.get(cv2.CAP_PROP_AUTO_EXPOSURE))
#解説4
# ゲインの値を設定(可能な場合)
# 注意: この
cap.set(cv2.CAP_PROP_GAIN, 144)
print(cap.get(cv2.CAP_PROP_GAIN))
#解説5
# 露光時間を設定(可能な場合)
cap.set(cv2.CAP_PROP_EXPOSURE, -8)
print(cap.get(cv2.CAP_PROP_EXPOSURE))
#解説6
while True:
# フレームをキャプチャ
ret, frame = cap.read()
if not ret:
break
# フレームを表示
cv2.imshow('Live', frame)
# 'q'キーが押されたらループから抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#解説7
# キャプチャをリリースし、ウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()
解説
解説1: ライブラリのインポート
import cv2
PythonのOpenCVライブラリをインポートしています。OpenCVは、画像処理やコンピュータビジョンに関する機能を提供するオープンソースのライブラリです。このライブラリをインポートすることで、後のコードでOpenCVの機能を使うことができます。例えば、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。
解説2: ビデオキャプチャの開始
cap = cv2.VideoCapture(0)
ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)
という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCapture
オブジェクトを返しています。ここでの0
は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なりますのでご注意ください。
補足:OpenCVにおけるデバイスID
デバイスが複数接続された場合、このIDは、いつも同じとは限りません。デバイスの起動やシステムへの接続順によって変わることがほとんどです。 TheImagingSource社が提供しているSDK(ICImagingControl)ではカメラ本体にシリアル番号が割り振られており、カメラ毎に設定が容易にできます。詳細は下記をご覧ください。 https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-with-built-in-dialog.html
解説3: 露光時間のマニュアル設定
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0) # 0 = Manual Mode, 1= Auto Mode
print(cap.get(cv2.CAP_PROP_AUTO_EXPOSURE))
cv2.CAP_PROP_AUTO_EXPOSURE
は自動露光設定のON/OFFを切り替えるためのプロパティです。自動露光をオフにする(マニュアルモードにする)ことで、露光時間をマニュアルで設定できます。
補足:
TheImagingSource社のビューワーソフトIC CaptureではUVCカメラのパラメータの設定範囲を確認することができます。
また、webカメラを使うアプリ(下図のようなMicrosoft Teams)でもパラメータの設定範囲を簡単に把握できます。パラメータを確認することで事前にゲインと露光時間の設定値を確認する事ができます。
解説4: ゲインの値の設定
cap.set(cv2.CAP_PROP_GAIN, 144) # ゲイン値を0に設定
print(cap.get(cv2.CAP_PROP_GAIN))
カメラのゲインの値を設定しています。ゲインの値を上げると、カメラの感度が上がり、暗い環境でも明るい画像を得られますが、ゲインを上げすぎるとノイズが増えてしまいます。そのためできるだけゲインは下げてご利用ください。
解説5: 露光時間の設定
cap.set(cv2.CAP_PROP_EXPOSURE, -8) # 露光時間を-8に設定
print(cap.get(cv2.CAP_PROP_EXPOSURE))
カメラの露光時間を設定しています。露光時間を長くすると、カメラ側で多くの光を集め、暗い環境でも明るい画像を得られます。しかし、露光時間を長くしすぎると、動きのある被写体がぼやけてしまいます。そのためできるだけ露光時間は短く設定してください。 ゲインと露光時間の関係については下記で説明を行っております。 https://www.argocorp.com/UVC_camera/UVC_exposure.html
解説6: ビデオキャプチャのループ
while True:
# フレームをキャプチャ
ret, frame = cap.read()
if not ret:
break
# フレームを表示
cv2.imshow('Live', frame)
# 'q'キーが押されたらループから抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
カメラが正常に開いている間、while文でループ処理をしています。ループ処理の中で、 cap.read()
を使ってカメラから1フレームを読み込み、この関数ではret
にフレームの読み込みが成功したかどうかを示すTrue/FalseのBoolean値、frame
は読み込んだフレームのデータが格納されます。その後ret
を参照して、フレームが取得できていなかった場合は処理を中断しています。
最後にcv2.imshow('Live', frame)
で読み込んだフレームを画面に表示します。
解説7: ビデオキャプチャのループ
# キャプチャをリリースし、ウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()
ここでは、使用が終わったリソースを適切に解放しています。
まず、 cap.release()
はプログラムが終了した際にリソースのリークを防ぐためにカメラデバイスを解放します。この呼び出しを忘れると、カメラが他のプログラムから使用できなくなる可能性があります。
最後にcv2.destroyAllWindows()
は、OpenCVで開かれた全てのウィンドウを閉じます