VCDプロパティ:オートフォーカス編
概要
フォーカス調整に関するVCDプロパティの実装方法について説明します。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | VCD_properties_autofocus_cs_3.5.zip |
実行結果
Visual Studioのプログラム上ではすでにボタンの設置や関数は定義済ですので、IC Imaging Contorl3.5をインストールされていれば、実行ボタンだけですぐにデバッグで動作確認することができます。
画面にあるそれぞれのボタンなどのコントローラの機能は下記の通りです。
フォーカス値スライダー | フォーカス値を調整します。 |
---|---|
[ワンプッシュ]ボタン | ワンプッシュでフォーカスを自動調整します。 |
[オートフォーカス最大値]スライダー | ワンプッシュボタンをクリックしたときにフォーカス値を設定できる最大の数値を指定します。 |
[オートフォーカス最小値]スライダー | ワンプッシュボタンをクリックしたときにフォーカス値を設定できる最小の数値を指定します。 |
[フォーカスROI有効化]チェックボックス | ホワイトバランスの赤、青、緑の色味を自動で調整します。 |
[Auto Roi Left]スライダー | オートフォーカスでフォーカスを合わせる範囲のLeftの座標位置を指定します。 |
[Auto Roi Right]スライダー | オートフォーカスでフォーカスを合わせる範囲のRightの座標位置を指定します。 |
[Auto Roi Top]スライダー | オートフォーカスでフォーカスを合わせる範囲のTopの座標位置を指定します。 |
[Auto Roi Bottom]チェックボックス | オートフォーカスでフォーカスを合わせる範囲のBottomの座標位置を指定します。 |
VCDプロパティの宣言
private TIS.Imaging.VCDSwitchProperty _autoRoiEnable;
private TIS.Imaging.VCDRangeProperty _focusValue;
private TIS.Imaging.VCDRangeProperty _focusMaxValue;
private TIS.Imaging.VCDRangeProperty _focusMinValue;
private TIS.Imaging.VCDRangeProperty _autoRoiRight;
private TIS.Imaging.VCDRangeProperty _autoRoiLeft;
private TIS.Imaging.VCDRangeProperty _autoRoiTop;
private TIS.Imaging.VCDRangeProperty _autoRoiBottom;
IC Imaging ControlではTheImagingSource社のデバイスの機能にアクセスするためにVCDプロパティと呼ばれるクラスを用意しています。
ここではVCDプロパティの簡単な例としてAutoFocusの実装方法について説明します。
VCDプロパティの設定方法については下記をご覧ください。
初期設定
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;
//フォーカス値
_focusValue = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_Value);
if( _focusValue == null )
{
FocusValueTrackBar.Enabled = false;
}
else
{
FocusValueTrackBar.Enabled = true;
FocusValueTrackBar.Minimum = _focusValue.RangeMin;
FocusValueTrackBar.Maximum = _focusValue.RangeMax;
FocusValueTrackBar.Value = _focusValue.Value;
FocusValueTrackBar.TickFrequency = (FocusValueTrackBar.Maximum - FocusValueTrackBar.Minimum) / 10;
FocusValueValueLabel.Text = FocusValueTrackBar.Value.ToString();
}
//フォーカス最小値
_focusMinValue = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_AutoMinValue);
if (_focusMinValue == null)
{
FocusAutoMinValueTrackBar.Enabled = false;
}
else
{
FocusAutoMinValueTrackBar.Enabled = true;
FocusAutoMinValueTrackBar.Minimum = _focusMinValue.RangeMin;
FocusAutoMinValueTrackBar.Maximum = _focusMinValue.RangeMax;
FocusAutoMinValueTrackBar.Value = _focusMinValue.Value;
FocusAutoMinValueTrackBar.TickFrequency = (FocusAutoMinValueTrackBar.Maximum - FocusAutoMinValueTrackBar.Minimum) / 10;
FocusAutoMinValueLabel.Text = _focusMinValue.Value.ToString();
}
//フォーカス最大値
_focusMaxValue = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_AutoMaxValue);
if (_focusMaxValue == null)
{
FocusAutoMaxValuetrackBar.Enabled = false;
}
else
{
FocusAutoMaxValuetrackBar.Enabled = true;
FocusAutoMaxValuetrackBar.Minimum = _focusMaxValue.RangeMin;
FocusAutoMaxValuetrackBar.Maximum = _focusMaxValue.RangeMax;
FocusAutoMaxValuetrackBar.Value = _focusMaxValue.Value;
FocusAutoMaxValuetrackBar.TickFrequency = (FocusAutoMaxValuetrackBar.Maximum - FocusAutoMaxValuetrackBar.Minimum) / 10;
FocusAutoMaxValueLabel.Text = _focusMaxValue.Value.ToString();
}
//ROI機能の有効化の設定
_autoRoiEnable = icImagingControl1.VCDPropertyItems.Find<VCDSwitchProperty>(VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_AutoRoiEnable);
if (_autoRoiEnable == null)
{
AutoRoiEnableCheckBox.Enabled = false;
AutoFocusOnePushButton.Enabled = false;
}
else
{
_autoRoiEnable.Switch = false;
}
//オートフォーカス Right
_autoRoiRight = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>( VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_AutoRoiRight );
if( _autoRoiRight == null )
{
AutoRoiRightTrackBar.Enabled = false;
}
else
{
AutoRoiRightTrackBar.Enabled = true;
AutoRoiRightTrackBar.Minimum = _autoRoiRight.RangeMin;
AutoRoiRightTrackBar.Maximum = _autoRoiRight.RangeMax;
AutoRoiRightTrackBar.Value = _autoRoiRight.Value;
AutoRoiRightTrackBar.TickFrequency = (AutoRoiRightTrackBar.Maximum - AutoRoiRightTrackBar.Minimum) / 10;
AutoRoiRightLabel.Text = _autoRoiRight.Value.ToString();
}
// オートフォーカス Left
_autoRoiLeft = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_AutoRoiLeft);
if(_autoRoiLeft == null )
{
AutoRoiLeftTrackBar.Enabled = false;
}
else
{
AutoRoiLeftTrackBar.Enabled = false;
AutoRoiLeftTrackBar.Enabled = true;
AutoRoiLeftTrackBar.Minimum = _autoRoiLeft.RangeMin;
AutoRoiLeftTrackBar.Maximum = _autoRoiLeft.RangeMax;
AutoRoiLeftTrackBar.Value = _autoRoiLeft.Value;
AutoRoiLeftTrackBar.TickFrequency = (AutoRoiLeftTrackBar.Maximum - AutoRoiLeftTrackBar.Minimum) / 10;
AutoRoiLeftLabel.Text = _autoRoiLeft.Value.ToString();
}
//オートフォーカス Top
_autoRoiTop = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_AutoRoiTop);
if (_autoRoiTop == null)
{
AutoRoiTopTrackBar.Enabled = false;
}
else
{
AutoRoiTopTrackBar.Enabled = false;
AutoRoiTopTrackBar.Enabled = true;
AutoRoiTopTrackBar.Minimum = _autoRoiTop.RangeMin;
AutoRoiTopTrackBar.Maximum = _autoRoiTop.RangeMax;
if (_autoRoiTop.Value > _autoRoiTop.RangeMax) _autoRoiTop.Value = _autoRoiTop.RangeMax;
if (_autoRoiTop.Value < _autoRoiTop.RangeMin) _autoRoiTop.Value = _autoRoiTop.RangeMin;
AutoRoiTopTrackBar.Value = _autoRoiTop.Value;
AutoRoiTopTrackBar.TickFrequency = (AutoRoiTopTrackBar.Maximum - AutoRoiTopTrackBar.Minimum) / 10;
AutoRoiTopLabel.Text = _autoRoiTop.Value.ToString();
}
//オートフォーカス Bottom
_autoRoiBottom = icImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_AutoRoiBottom);
if (_autoRoiBottom == null)
{
AutoRoiBottomTrackBar.Enabled = false;
}
else
{
AutoRoiBottomTrackBar.Enabled = false;
AutoRoiBottomTrackBar.Enabled = true;
AutoRoiBottomTrackBar.Minimum = _autoRoiBottom.RangeMin;
AutoRoiBottomTrackBar.Maximum = _autoRoiBottom.RangeMax;
AutoRoiBottomTrackBar.Value = _autoRoiBottom.Value;
AutoRoiBottomTrackBar.TickFrequency = (AutoRoiBottomTrackBar.Maximum - AutoRoiBottomTrackBar.Minimum) / 10;
AutoRoiBottomLabel.Text = _autoRoiBottom.Value.ToString();
}
AutoRoiRightTrackBar.Enabled = AutoRoiEnableCheckBox.Checked;
AutoRoiLeftTrackBar.Enabled = AutoRoiEnableCheckBox.Checked;
AutoRoiTopTrackBar.Enabled = AutoRoiEnableCheckBox.Checked;
AutoRoiBottomTrackBar.Enabled = AutoRoiEnableCheckBox.Checked;
// ライブストリーミング開始
icImagingControl1.LiveStart();
}
デバイスを選択後、VCDPropertyItems.Findメソッドを使って下記のitem識別子とelement識別子を引数に割り当てることによりVCDPropertyInterfaceを取得できます。
コントローラ | グローバル オブジェクト |
item識別子 | element識別子 | インターフェース |
---|---|---|---|---|
[フォーカス値]スライダー | _focusValue | VCDID_Focus | VCDElement_Value | VCDRangeProperty |
[ワンプッシュ]ボタン | autoFocusOnePush | VCDID_Focus | VCDElement_OnePush | VCDButtonProperty |
[オートフォーカス] 最大値スライダー |
_focusMaxValue | VCDID_Focus | VCDElement_AutoMaxValue | VCDRangeProperty |
[オートフォーカス] 最小値スライダー |
_focusMinValue | VCDID_Focus | VCDElement_AutoMinValue | VCDRangeProperty |
[フォーカスROI有効化] チェックボックス |
_autoRoiEnable | VCDID_Focus | VCDElement_AutoRoiEnable | VCDSwitchProperty |
[Auto Roi Left] スライダー |
_autoRoiLeft | VCDID_Focus | VCDElement_AutoRoiLeft | VCDRangeProperty |
[Auto Roi Right] スライダー |
_autoRoiRight | VCDID_Focus | VCDElement_AutoRoiRight | VCDRangeProperty |
[Auto Roi Top] スライダー |
_autoRoiTop | VCDID_Focus | VCDElement_AutoRoiTop | VCDRangeProperty |
[Auto Roi Bottom] チェックボックス |
_autoRoiBottom | VCDID_Focus | VCDElement_AutoRoiBottom | VCDRangeProperty |
item識別子は下記をご覧ください。
element識別子は下記をご覧ください
スライダーのイベントハンドラ
private void FocusValueTrackBar_Scroll(object sender, EventArgs e)
{
_focusValue.Value = FocusValueTrackBar.Value;
FocusValueValueLabel.Text = _focusValue.Value.ToString();
}
グローバル変数で宣言したプロパティを調整するためにどのようにインターフェースを使うかはスライダーの変更時のイベントハンドラと紐づける必要があります。イベントハンドラ内ではコントローラに対してグローバル変数で宣言したプロパティを割り当てるだけでコントローラによる制御ができるようになります。ここでは冒頭で宣言した変数(_focusValue)をスライダー(FocusValueTrackBar)に割り当てるようにします。_focusValueを割り当てるだけでデバイスとコントローラの同期をとることが可能です。
[ワンプッシュ]ボタン(イベントハンドラ)
private void AutoFocusOnePushButton_Click( object sender, EventArgs e )
{
//変数autoFocusOnePush にオートフォーカスのワンプッシュ機能を割り当て
var autoFocusOnePush = icImagingControl1.VCDPropertyItems.Find<VCDButtonProperty>( VCDGUIDs.VCDID_Focus, VCDGUIDs.VCDElement_OnePush );
if(autoFocusOnePush != null )
{
autoFocusOnePush.Push();
AutoFocusOnePushButton.Enabled =false;
//ワンプッシュボタンをクリックしたときにフォーカスの値を反映する
while (true){
int oldvalue = _focusValue.Value;
System.Threading.Thread.Sleep(1000);
FocusValueTrackBar.Value = _focusValue.Value;
FocusValueValueLabel.Text = _focusValue.Value.ToString();
if (oldvalue == _focusValue.Value)
{
AutoFocusOnePushButton.Enabled = true;
break;
}
}
}
}
グローバル変数を宣言を必要としない(関数をまたがないような処理の場合)VCDButtonPropertyのようなインターフェースであれば、上記のようにイベントハンドラ内で変数をセットし割り当てるだけで簡単にメソッドを呼び出すことができます。
プログラマーズガイド:VCDプロパティの基本機能
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル