プロパティ設定におけるゲイン・露光時間の調整方法

概要

ゲインと露光時間は、カメラの画像の明るさを制御するための重要な設定項目です。 特に、照明条件が一定でない場合や、特定の被写体の明るさを強調したい場合に有効です。ゲインはイメージセンサのシグナルを増幅し、露光時間はイメージセンサが光を集める時間を制御します。これらを適切に設定することで、明るさ、コントラスト、ノイズなどの画像品質を最適化できます。しかし、ゲインや露光時間の自動設定によって連続した画像間で明るさが一定でなくなる場合があり、設定状況によっては画像解析の精度が低下する可能性があるので注意が必要です。

出力結果

OpenCVで露光時間やゲインを調整する方法

プログラム全体

#解説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の機能を使うことができます。例えば、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。

産業用UVCのすすめ

解説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で開かれた全てのウィンドウを閉じます