プロパティ設定情報をxmlで保存する
概要
プロパティ設定情報をXMLで保存することは、カメラの設定を維持するために重要です。例えば、特定の照明条件や被写体に対して最適化されたカメラの設定を、毎回同じ条件で撮影する際に役立ちます。また、異なるカメラ間で設定を共有したり、設定のバックアップを取るためにも利用できます。これにより、手動で毎回設定を調整する手間を省き、撮影条件の再現性を向上させることができます。
### 補足:XMLファイルとは XMLは、文章の見た目や構造を記述するためのマークアップ言語の一種で、主にデータのやりとりや管理を簡単にする目的で使われ、記述形式がわかりやすいという特徴があります。カメラに限らず、ソフトウェアやデバイス等では各種設定値をXML形式でエクスポートし、後に再利用できる事が多く、OpenCVでも実装が可能です。
出力結果
frame_width: 640.0
frame_height: 480.0
fps: 30.0
fourcc: 1196573255.0
brightness: 240.0
contrast: -1.0
saturation: 64.0
hue: 0.0
gain: 110.0
exposure: -8.0
convert_rgb: 1.0
auto_exposure: 1.0
gamma: 100.0
zoom: -1.0
focus: -1.0
auto_wb: -1.0
wb_temperature: -1.0
プログラム全体
#解説1
import cv2
import xml.etree.ElementTree as ET
#解説2
# ビデオキャプチャを開始します(ここではデフォルトのWebカメラを使用)
cap = cv2.VideoCapture(0)
#解説3
# プロパティ名とその値を辞書で管理します
properties = {
'frame_width': cv2.CAP_PROP_FRAME_WIDTH,
'frame_height': cv2.CAP_PROP_FRAME_HEIGHT,
'fps': cv2.CAP_PROP_FPS,
'fourcc': cv2.CAP_PROP_FOURCC,
'brightness': cv2.CAP_PROP_BRIGHTNESS,
'contrast': cv2.CAP_PROP_CONTRAST,
'saturation': cv2.CAP_PROP_SATURATION,
'hue': cv2.CAP_PROP_HUE,
'gain': cv2.CAP_PROP_GAIN,
'exposure': cv2.CAP_PROP_EXPOSURE,
'convert_rgb': cv2.CAP_PROP_CONVERT_RGB,
'auto_exposure': cv2.CAP_PROP_AUTO_EXPOSURE,
'gamma': cv2.CAP_PROP_GAMMA,
'focus': cv2.CAP_PROP_FOCUS,
'auto_wb': cv2.CAP_PROP_AUTO_WB,
'wb_temperature': cv2.CAP_PROP_WB_TEMPERATURE,
}
#解説4
# XML構造を作成します
root = ET.Element('properties') # ルートエレメントを作成
for name, prop_id in properties.items():
value = cap.get(prop_id) # プロパティの値を取得
element = ET.SubElement(root, name) # エレメントを作成
element.text = str(value) # 値を設定
# XMLファイルに保存します
tree = ET.ElementTree(root) # XMLツリーを作成
tree.write('properties.xml') # XMLファイルに書き出し
#解説5
# XMLファイルからデータを読み込みます
tree = ET.parse('properties.xml')
root = tree.getroot()
# XMLファイルから読み込んだデータをパラメータとして設定します
for name in properties.keys():
value = float(root.find(name).text)
cap.set(properties[name], value)
# print(name +':' + cap.get(properties[name]))
print(f"{name}: {cap.get(properties[name])}")
#解説6
# ビデオキャプチャを解放します
cap.release()
解説
解説1: ライブラリのインポート
import cv2
import xml.etree.ElementTree as ET
PythonのOpenCVライブラリと、XMLファイルの読み書きを行うためのモジュール(xml.etree.ElementTree)
を ETという名前でインポートしています。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: プロパティの管理
properties = {
'frame_width': cv2.CAP_PROP_FRAME_WIDTH,
'frame_height': cv2.CAP_PROP_FRAME_HEIGHT,
'fps': cv2.CAP_PROP_FPS,
'fourcc': cv2.CAP_PROP_FOURCC,
'brightness': cv2.CAP_PROP_BRIGHTNESS,
'contrast': cv2.CAP_PROP_CONTRAST,
'saturation': cv2.CAP_PROP_SATURATION,
'hue': cv2.CAP_PROP_HUE,
'gain': cv2.CAP_PROP_GAIN,
'exposure': cv2.CAP_PROP_EXPOSURE,
'convert_rgb': cv2.CAP_PROP_CONVERT_RGB,
'auto_exposure': cv2.CAP_PROP_AUTO_EXPOSURE,
'gamma': cv2.CAP_PROP_GAMMA,
'focus': cv2.CAP_PROP_FOCUS,
'auto_wb': cv2.CAP_PROP_AUTO_WB,
'wb_temperature': cv2.CAP_PROP_WB_TEMPERATURE,
}
この部分では、ビデオキャプチャの各種プロパティをキーと値を組み合わせたdictionary(辞書)形式で設定しています。これにより、後続の処理でプロパティ名を指定して値を取得したり設定したりすることができます。
プロパティ名 | 説明 |
---|---|
cv2.CAP_PROP_FRAME_WIDTH | カメラのフレームの幅を設定する際に使用します。 |
cv2.CAP_PROP_FRAME_HEIGHT | カメラのフレームの高さを設定する際に使用します。 |
cv2.CAP_PROP_FPS | カメラのフレームレート(1秒あたりのフレーム数)を設定する際に使用します。 |
cv2.CAP_PROP_FOURCC | カメラコーデックを指定する際に使用します。 |
cv2.CAP_PROP_BRIGHTNESS | カメラの明るさを調整する際に使用します。 |
cv2.CAP_PROP_CONTRAST | カメラのコントラストを調整する際に使用します。 |
cv2.CAP_PROP_SATURATION | カメラの彩度を調整する際に使用します。 |
cv2.CAP_PROP_HUE | カメラの色相を調整する際に使用します。 |
cv2.CAP_PROP_GAIN | カメラのゲイン(画像の明るさを増加させるための倍率)を調整する際に使用します。 |
cv2.CAP_PROP_EXPOSURE | カメラの露出を調整する際に使用します。 |
cv2.CAP_PROP_CONVERT_RGB | カメラがBGR形式からRGB形式に変換するかどうかを設定する際に使用します。 |
cv2.CAP_PROP_AUTO_EXPOSURE | カメラの自動露出をオンまたはオフにする際に使用します。 |
cv2.CAP_PROP_GAMMA | カメラのガンマ補正を調整する際に使用します。 |
cv2.CAP_PROP_FOCUS | カメラのフォーカスを調整する際に使用します。(ほとんどのカメラで使用できない) |
cv2.CAP_PROP_AUTO_WB | カメラの自動ホワイトバランスをオンまたはオフにする際に使用します。(ほとんどのカメラで使用できない) |
cv2.CAP_PROP_WB_TEMPERATURE | カメラのホワイトバランスの色温度を調整する際に使用します。(ほとんどのカメラで使用できない) |
解説4: XMLファイルの作成と保存
root = ET.Element('properties') # ルートエレメントを作成
for name, prop_id in properties.items():
value = cap.get(prop_id) # プロパティの値を取得
element = ET.SubElement(root, name) # エレメントを作成
element.text = str(value) # 値を設定
tree = ET.ElementTree(root) # XMLツリーを作成
tree.write('properties.xml') # XMLファイルに書き出し
ここでビデオキャプチャの各種プロパティをXMLファイルに書き出しています。まず、ET.Element('properties')
でXMLのルートエレメントを作成し、次にproperties辞書の各項目についてループを回し、その名前とIDを使ってビデオキャプチャからプロパティの値を取得します。その取得した値を文字列に変換し、新たに作成したXMLエレメントのテキストとして設定します。これを全てのプロパティについて行います。最後に、作成したXMLツリーをproperties.xml
という名前のファイルに書き出します。これにより、プログラムを再実行したときでも同じカメラ設定を再現することができます。
解説5: XMLファイルからのデータの読み込みとパラメータの設定
tree = ET.parse('properties.xml')
root = tree.getroot()
for name in properties.keys():
value = float(root.find(name).text)
cap.set(properties[name], value)
print(cap.get(properties[name]))
この部分では、先ほど保存したXMLファイルからデータを読み込み、それをビデオキャプチャのパラメータとして設定しています。まず、ET.parse('properties.xml')
でXMLファイルを読み込み、そのルートエレメントを取得します。次に、properties辞書の各項目についてループを回し、その名前を使ってXMLから対応するエレメントを見つけ、そのテキストを浮動小数点数に変換します。その値をビデオキャプチャの対応するプロパティに設定します。最後に、設定したプロパティの名前と値を表示します。これにより、XMLファイルに保存した設定をビデオキャプチャに適用し、その結果を確認することができます。
補足:プロパティ値の -1について
-1が出力されていた場合、デバイスはプロパティを設定することができません。そのため、下記のようなメーカー製のSDKを使って制御するようにしてください。
TheImagingSource社のSDK(ICImagingControl)では簡単に設定をXMLで保存/読み込みすることができます。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/save-and-restore-device-properties.html
解説6: ビデオキャプチャの解放
cap.release()
最後に、ビデオキャプチャを解放しています。これは、ビデオキャプチャを終了し、使用していたリソースを解放するために必要です。これを行わないと、プログラムが終了してもカメラデバイスが解放されず、他のプログラムから使用できなくなる可能性があります。