VCDプロパティ:明るさとホワイトバランス編
概要
明るさとホワイトバランスのVCDプロパティの実装方法について説明します。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | vcd_simple_property_cs_3.5.zip |
実行結果
Visual Studioのプログラム上ではすでにボタンの設置や関数は定義済ですので、IC Imaging Contorl3.5をインストールされていれば、実行ボタンだけですぐにデバッグで動作確認することができます。
画面にあるそれぞれのボタンなどのコントローラの機能は下記の通りです。
[Brightness]スライダー | 明るさを調整します。 |
---|---|
[Auto Brightness]チェックボックス | 明るさを自動で調整します。 |
[Whitebalance Red]スライダー | ホワイトバランス赤の色味を調整します。 |
[Whitebalance Blue]スライダー | ホワイトバランス青の色味を調整します。 |
[Whitebalance Green]スライダー | ホワイトバランス緑の色味を調整します。 |
[Auto Whitebalance]チェックボックス | ホワイトバランスの赤、青、緑の色味を自動で調整します。 |
[One Push]ボタン | ホワイトバランスの赤、青、緑の色味をワンショットすることで調整します。 |
VCDプロパティの宣言
private TIS.Imaging.VCDSwitchProperty _brightnessAuto;
private TIS.Imaging.VCDSwitchProperty _whitebalanceAuto;
private TIS.Imaging.VCDRangeProperty _brightnessRange;
private TIS.Imaging.VCDRangeProperty _whitebalanceBlueRange;
private TIS.Imaging.VCDRangeProperty _whitebalanceRedRange;
private TIS.Imaging.VCDRangeProperty _whitebalanceGreenRange;
プロパティを操作する為には適切な項目、要素、インターフェースを呼び出す必要があり、VCDGUIDsと呼ばれるプロパティを特定するための識別子を使います。VCDGUIDsの中にはElement、Interface、Property Itemが含まれています。
スライダーやチェックボックスで操作しやすくするためにSwitch、Rangeのインターフェイスをグローバルオブジェクトとして宣言します。
その他のインターフェースの一覧は下記にありますので、他のインターフェースを使用する場合にはご確認ください。
初期設定
private void Form1_Load( object sender, EventArgs e )
{
if( !icImagingControl1.LoadShowSaveDeviceState("lastSelectedDeviceState.xml") )
{
MessageBox.Show("No device was selected.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
return;
}
// カメラから出力された映像をIC Imaging Contorolのコントロール表示サイズにする
icImagingControl1.LiveDisplayDefault = false;
icImagingControl1.LiveDisplaySize = icImagingControl1.Size;
// 自動明るさの設定
// 自動設定のためのスイッチインターフェースへのインターフェースを所得
_brightnessAuto = icImagingControl1.VCDPropertyItems.Find<VCDSwitchProperty>( VCDGUIDs.VCDID_Brightness, VCDGUIDs.VCDElement_Auto );
if( _brightnessAuto == null )
{
//このデバイスではAuto brightnessがサポートされていない
BrightnessAutoCheckBox.Enabled = false;
}
else
{
_brightnessAuto.Switch = false;
}
// 明るさの設定
// 値の設定のためのレンジインターフェースへのインターフェースを所得
_brightnessRange = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>( VCDGUIDs.VCDID_Brightness, VCDGUIDs.VCDElement_Value );
if( _brightnessRange == null )
{
BrightnessTrackBar.Enabled = false;
}
else
{
// _brightnessRangeインターフェースをBrightnessスライダーに割り当て
BrightnessTrackBar.Enabled = true;
BrightnessTrackBar.Minimum = _brightnessRange.RangeMin;
BrightnessTrackBar.Maximum = _brightnessRange.RangeMax;
BrightnessTrackBar.Value = _brightnessRange.Value;
BrightnessTrackBar.TickFrequency = (BrightnessTrackBar.Maximum - BrightnessTrackBar.Minimum) / 10;
BrightnessValueLabel.Text = BrightnessTrackBar.Value.ToString();
}
// 自動ホワイトバランスの設定
// 自動設定のためのスイッチインターフェースへのインターフェースを所得
_whitebalanceAuto = icImagingControl1.VCDPropertyItems.Find<VCDSwitchProperty>(VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_Auto);
// _whitebalanceAutoインターフェースをAuto Whitebalanceチェックボックスに割り当て
if (_whitebalanceAuto == null)
{
WhitebalanceCheckBox.Enabled = false;
WhitebalanceOnePushButton.Enabled = false;
}
else
{
_whitebalanceAuto.Switch = false;
}
// ホワイトバランス 青の設定
_whitebalanceBlueRange = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>( VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceBlue );
if( _whitebalanceBlueRange == null )
{
WhiteBalBlueTrackBar.Enabled = false;
}
else
{
WhiteBalBlueTrackBar.Enabled = true;
WhiteBalBlueTrackBar.Minimum = _whitebalanceBlueRange.RangeMin;
WhiteBalBlueTrackBar.Maximum = _whitebalanceBlueRange.RangeMax;
WhiteBalBlueTrackBar.Value = _whitebalanceBlueRange.Value;
WhiteBalBlueTrackBar.TickFrequency = (WhiteBalBlueTrackBar.Maximum - WhiteBalBlueTrackBar.Minimum) / 10;
WhiteBalBlueLabel.Text = WhiteBalBlueTrackBar.Value.ToString();
}
// ホワイトバランス 赤の設定
_whitebalanceRedRange = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>( VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceRed );
if( _whitebalanceRedRange == null )
{
WhiteBalRedTrackBar.Enabled = false;
}
else
{
WhiteBalRedTrackBar.Enabled = false;
WhiteBalRedTrackBar.Enabled = true;
WhiteBalRedTrackBar.Minimum = _whitebalanceRedRange.RangeMin;
WhiteBalRedTrackBar.Maximum = _whitebalanceRedRange.RangeMax;
WhiteBalRedTrackBar.Value = _whitebalanceRedRange.Value;
WhiteBalRedTrackBar.TickFrequency = (WhiteBalRedTrackBar.Maximum - WhiteBalRedTrackBar.Minimum) / 10;
WhiteBalRedLabel.Text = WhiteBalRedTrackBar.Value.ToString();
}
// ホワイトバランス 緑の設定
_whitebalanceGreenRange = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceGreen);
if (_whitebalanceGreenRange == null)
{
WhiteBalGreenTrackBar.Enabled = false;
}
else
{
WhiteBalGreenTrackBar.Enabled = false;
WhiteBalGreenTrackBar.Enabled = true;
WhiteBalGreenTrackBar.Minimum = _whitebalanceGreenRange.RangeMin;
WhiteBalGreenTrackBar.Maximum = _whitebalanceGreenRange.RangeMax;
WhiteBalGreenTrackBar.Value = _whitebalanceGreenRange.Value;
WhiteBalGreenTrackBar.TickFrequency = (WhiteBalGreenTrackBar.Maximum - WhiteBalGreenTrackBar.Minimum) / 10;
WhiteBalGreenLabel.Text = WhiteBalGreenTrackBar.Value.ToString();
}
// ライブストリーミング開始
icImagingControl1.LiveStart();
}
デバイスを選択後、VCDPropertyItems.Findメソッドを使って下記のitem識別子とelement識別子を引数に割り当てることによりVCDPropertyInterfaceを取得できます。
コントローラ | グローバル オブジェクト |
item識別子 | element識別子 | インターフェース |
---|---|---|---|---|
[Auto Brightness] チェックボックス |
_brightnessAuto | VCDID_Brightness | VCDElement_Value | VCDSwitchProperty |
[Brightness] スライダー |
_brightnessRange | VCDID_Brightness | VCDElement_Value | VCDRangeProperty |
[Whitebalance Red] スライダー |
_whitebalanceRedRange | VCDID_WhiteBalance | VCDElement_WhiteBalanceRed | VCDRangeProperty |
[Whitebalance Blue] スライダー |
_whitebalanceBlueRange | VCDID_WhiteBalance | VCDElement_WhiteBalanceBlue | VCDRangeProperty |
[Whitebalance Green] スライダー |
_whitebalanceGreenRange | VCDID_WhiteBalance | VCDElement_WhiteBalanceGreen | VCDRangeProperty |
[Auto Whitebalance] チェックボックス |
_whitebalanceAuto | VCDID_WhiteBalance | VCDElement_Auto | VCDSwitchProperty |
[One Push]ボタン | whiteBalanceOnePush (Private変数 後述) |
VCDID_WhiteBalance | VCDElement_OnePush | VCDButtonProperty |
item識別子は下記をご覧ください。
element識別子は下記をご覧ください
明るさの調整(イベントハンドラ)
//Auto Brightnessチェックボックス(明るさの自動調整の有効化/無効化)
private void BrightnessAutoCheckBox_CheckedChanged( object sender, EventArgs e )
{
_brightnessAuto.Switch = BrightnessAutoCheckBox.Checked;
BrightnessTrackBar.Enabled = !BrightnessAutoCheckBox.Checked;
}
//Brightnessスライダー(明るさの自動調整の有効化/無効化)
private void BrightnessTrackBar_Scroll(object sender, EventArgs e)
{
_brightnessRange.Value = BrightnessTrackBar.Value;
BrightnessValueLabel.Text = _brightnessRange.Value.ToString();
}
イベントハンドラは上記の通りとなっております。冒頭で宣言した_brightnessAutoと_brightnessRangeをチェックボックス(BrightnessAutoCheckBox)とスライダー(BrightnessTrackBar)に割り当てるようにします。
ホワイトバランスの調整
//Auto Whitebalanceチェックボックスにチェックを入れた時の処理( Whitebalanceの自動調整の有効化/無効化)
private void WhitebalanceCheckBox_CheckedChanged( object sender, EventArgs e )
{
_whitebalanceAuto.Switch = WhitebalanceCheckBox.Checked;
WhiteBalBlueTrackBar.Enabled = !WhitebalanceCheckBox.Checked;
WhiteBalRedTrackBar.Enabled = !WhitebalanceCheckBox.Checked;
WhiteBalGreenTrackBar.Enabled = !WhitebalanceCheckBox.Checked;
WhiteBalBlueTrackBar.Value = _whitebalanceBlueRange.Value;
WhiteBalRedTrackBar.Value = _whitebalanceRedRange.Value;
WhiteBalGreenTrackBar.Value = _whitebalanceGreenRange.Value;
}
//Whitebalance Redスライダーを変更した時の処理
private void WhiteBalRedTrackBar_Scroll( object sender, EventArgs e )
{
_whitebalanceRedRange.Value = WhiteBalRedTrackBar.Value;
WhiteBalRedLabel.Text = _whitebalanceRedRange.Value.ToString();
}
//Whitebalance Blueスライダーを変更した時の処理
private void WhiteBalBlueTrackBar_Scroll( object sender, EventArgs e )
{
_whitebalanceBlueRange.Value = WhiteBalBlueTrackBar.Value;
WhiteBalBlueLabel.Text = _whitebalanceBlueRange.Value.ToString();
}
//Whitebalance Greenスライダーを変更した時の処理
private void WhiteBalGreenTrackBar_Scroll(object sender, EventArgs e)
{
_whitebalanceGreenRange.Value = WhiteBalGreenTrackBar.Value;
WhiteBalGreenLabel.Text = _whitebalanceGreenRange.Value.ToString();
}
グローバル変数で宣言したプロパティを調整するためにどのようにインターフェースを使うかはそれぞれのチェックボックスの変更時のイベントハンドラやスライダーの変更時のイベントハンドラと紐づける必要があります。イベントハンドラ内ではコントローラに対してグローバル変数で宣言したプロパティを割り当てるだけでコントローラによる制御ができるようになります。例えば、WhitebalanceCheckBox_CheckedChangedのチェックボックスを変更した時のイベントハンドラにはチェックボックスのValueプロパティにグローバル変数_whitebalanceAuto割り当てるだけでデバイスとコントローラの同期をとることが可能です。
//One Pushボタンをクリックした時の処理
private void WhitebalanceOnePushButton_Click( object sender, EventArgs e )
{
//変数whiteBalanceOnePushにホワイトバランスのワンプッシュ機能を割り当て
var whiteBalanceOnePush = icImagingControl1.VCDPropertyItems.Find<VCDButtonProperty>( VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_OnePush );
if( whiteBalanceOnePush != null )
{
//Pushメソッドを呼び出すだけでワンプッシュでホワイトバランスを調整する
whiteBalanceOnePush.Push();
//ホワイトバランスのBlue,Red,Greenスライダーに反映する
WhiteBalBlueTrackBar.Value = _whitebalanceBlueRange.Value;
WhiteBalRedTrackBar.Value = _whitebalanceRedRange.Value;
WhiteBalGreenTrackBar.Value = _whitebalanceGreenRange.Value;
}
}
グローバル変数を宣言を必要としない(関数をまたがないような処理の場合)VCDButtonPropertyのようなインターフェースであれば、上記のようにイベントハンドラ内で変数をセットし割り当てるだけで簡単にメソッドを呼び出すことができます。
下記のAPIリファレンスマニュアルにもその他関数などの説明があります。
プログラマーズガイド:VCDプロパティの基本機能
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル