プロパティ設定におけるホワイトバランスの調整方法

概要

ホワイトバランスの調整は、カメラが色をどのように解釈するかを制御するための重要な機能です。特に、FA(Factory Automation)や研究開発の用途では、色の正確さが求められるため、ホワイトバランスの手動設定が必要となります。自動ホワイトバランスの場合、照明条件の変化により色見が変わってしまうデメリットがあります。しかし、手動設定を利用することで、一定の色見を保つことが可能です。UVC(USB Video Class)カメラでは、自動ホワイトバランスが多いので注意が必要です。

出力結果

OpenCVでホワイトバランスを手動調整する方法

ホワイトバランスが機能しない場合は下記のパラメータ値が出力されます。

-1.0 -1.0

プログラム全体

#解説1 import cv2 #解説2 # カメラのビデオキャプチャを開始 cap = cv2.VideoCapture(0) #解説3 # ホワイトバランスを手動モードに設定(可能な場合) # 注意: このプロパティはすべてのカメラでサポートされているわけではありません cap.set(cv2.CAP_PROP_AUTO_WB, 0) # 0 = OFF, 1 = ON print(cap.get(cv2.CAP_PROP_AUTO_WB)) #解説4 # ホワイトバランスの色温度を設定(可能な場合) # 注意: このプロパティはすべてのカメラでサポートされているわけではありません cap.set(cv2.CAP_PROP_WB_TEMPERATURE, 100) # 色温度を4000に設定 print(cap.get(cv2.CAP_PROP_WB_TEMPERATURE)) #解説5 while True: # フレームをキャプチャ ret, frame = cap.read() if not ret: break # フレームを表示 cv2.imshow('Live', frame) # 'q'キーが押されたらループから抜ける if cv2.waitKey(1) & 0xFF == ord('q'): break #解説6 # キャプチャをリリースし、ウィンドウを閉じる cap.release() cv2.destroyAllWindows()

解説

解説1: ライブラリのインポート

import cv2

PythonのOpenCVライブラリをインポートしています。OpenCVは、画像処理やコンピュータビジョンに関する機能を提供するオープンソースのライブラリです。このライブラリをインポートすることで、後のコードでOpenCVの機能を使うことができます。例えば、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。

解説2: ビデオキャプチャの開始

cap = cv2.VideoCapture(0)

ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCaptureオブジェクトを返しています。ここでの0は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なりますのでご注意ください。

解説3: ホワイトバランスの手動設定

cap.set(cv2.CAP_PROP_AUTO_WB, 0) # 0 = OFF, 1 = ON print(cap.get(cv2.CAP_PROP_AUTO_WB))

ホワイトバランスを手動モードに設定するためのものです。ホワイトバランスは、カメラが色をどのように解釈するかを制御します。 自動モード(AUTO_WB=1)では、カメラが自動的に色を調整します。 自動ホワイトバランス(AUTO_WB=1)が有効な場合、カメラは照明条件を自動的に評価し、色のバランスを調整して「白」が真白に見えるようにします。 手動モード(AUTO_WB=0)では、ユーザーが任意の色のバランスを指定できます。

解説4: ホワイトバランスの色温度設定

cap.set(cv2.CAP_PROP_WB_TEMPERATURE, 4000) # 色温度を4000K(ケルビン)に設定 print(cap.get(cv2.CAP_PROP_WB_TEMPERATURE))

上記のコードはホワイトバランスの色温度を設定するためのものです。色温度は、色の「暖かさ」または「冷たさ」を制御します。色温度は、光源の色が人間の目にどのように見えるかを表し、単位はケルビン(K)です。 色温度を調整することで、特定の照明条件下での色の見え方を微調整できます。 ほとんどのカメラではOpenCVでのホワイトバランスをサポートしていないためprint(cap.get(cv2.CAP_PROP_WB_TEMPERATURE))-1が出力されます。 OpenCV(現時点version:4.8.0)でホワイトバランスを調整するには色温度しかなく、RGBのそれぞれのゲインを調整する項目がありません。
https://docs.opencv.org/4.8.0/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d

補足:

TheImagingSource社のカメラではPythonのホワイトバランスのRGB値のゲインを調整できるようにサポートしています。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/properties-page.html

解説5: フレームのキャプチャと表示

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()を使ってカメラからフレームを取得します。まず、 cap.read()でカメラから1フレームを読み込みます。この関数ではretにフレームの読み込みが成功したかどうかを示すTrue/FalseのBoolean値、frameは読み込んだフレームのデータが格納されます。cv2.imshow('Live', frame)で読み込んだフレームを画面に表示します。ここで'Live'は表示ウィンドウの名前です。 cv2.waitKey(1)はキーボードからの入力を1ミリ秒待ちます。そして& 0xFF == ord('q')の部分で、入力されたキーが'q'であればループを抜ける(プログラムを終了する)ようにしています。

解説6: リソースの解放

cap.release() cv2.destroyAllWindows()

ここでは、使用が終わったリソースを適切に解放しています。 まず、 cap.release()はプログラムが終了した際にリソースのリークを防ぐためにカメラデバイスを解放します。この呼び出しを忘れると、カメラが他のプログラムから使用できなくなる可能性があります。 最後にcv2.destroyAllWindows()は、OpenCVで開かれた全てのウィンドウを閉じます。