VCDプロパティ
VCDプロパティは画像取り込みデバイスの設定を行うためのもので、包括的でハードウェアに依存せず、かつ拡張も可能です。
基本コンセプト
VCDプロパティはツリー構造で構成されています。さらにそれは値や自動設定のような要素を含んでいます。よってプロパティは名前と要素のセットを持ったオブジェクトということができるでしょう。このオブジェクトは VCDPropertyItemクラスライブラリリファレンス>クラス>VCDPropertyItemと呼ばれます。要素は VCDPropertyElementクラスライブラリリファレンス>クラス>VCDPropertyElement と呼び、エレメントを調整する為のインターフェースのセットを含んでいます。そしてインターフェースはプロパティへの様々なアクセスメソッドを提供します。 例えば VCDRangePropertyクラスライブラリリファレンス>クラス>VCDRangePropertyというインターフェースはDirectShowのプロパティアクセスと同様のものを提供します。VCDAbsoluteValuePropertyクラスライブラリリファレンス>クラス>VCDAbsoluteValueProperty は物理的な単位を使って高精度なプロパティアクセスを提供します。こういったことを考えると VCDプロパティの構成は明らかになります。プロパティ項目はプロパティ要素を含み、さらにそのなかに1つ以上のインターフェースがあるということになります。プロパティを操作する為には適切な項目、要素、インターフェースを呼び出す必要があるということです。スタートメニューから "VCD Property Inspector"を開き、VCD プロパティがどのように構成されているかをご覧になってください。
特定のプロパティインターフェースを探す
特定の1つのプロパティにアクセスするには、VCDPropertyItemsクラスライブラリリファレンス>クラス>VCDPropertyItemsを使います。個別のコンポーネントと必要なインターフェースタイプを指定するだけで、対応するインターフェースが表示されるか、またはオブジェクトが見つからなかったことを示すためにnullが返されます。
以下のシンプルな例ではAuto-Exposureを無効にする方法を示しています。
VCDSwitchProperty exposureAuto = ICImagingControl1.VCDPropertyItems.Find<VCDSwitchProperty>(VCDGUIDs.VCDID_Exposure, VCDGUIDs.VCDElement_Auto);
if( exposureAuto != null )
{
exposureAuto.Switch = false;
}
プロパティオブジェクトを見つける
プロパティオブジェクトを見つけるにはまず最初にプロパティ項目、要素、あるいはインターフェースを指定する手段が必要となります。VCDGUIDsクラスライブラリリファレンス>クラス>VCDGUIDs モジュールにて定義されている全てのプロパティ項目、要素、インターフェースにはGUIDs (Global Unique Identifiers)という識別子が割り当てられており、それをVCDプロパティ内での検出に使用します。接続されているビデオキャプチャデバイスで支援されているプロパティ項目は全てVCDPropertyItemsクラスライブラリリファレンス>クラス>VCDPropertyItemsコ レクションに含まれています。このコレクションはプロパティ項目、要素、インターフェースを呼び出すメソッドを提供します。VCDPropertyItems.FindItemクラスライブラリリファレンス>クラス>VCDPropertyItems>VCDPropertyItems.FindItem Method、VCDPropertyItems.FindElementクラスライブラリリファレンス>クラス>VCDPropertyItems>VCDPropertyItems.FindElement Method、VCDPropertyItems.FindInterfaceクラスライブラリリファレンス>クラス>VCDPropertyItems>VCDPropertyItems.FindInterface Methodの3つのメソッドがそれにあたります。呼び出されるオブジェクトはFindItem用GUIDと他の二つ(FindElementとFindInterface)用のGUIDの組み合わせにより指定される必要があります。以下、それらをGUIDパスと呼ぶことにします。
インターフェースを見つける
前述の通り、インターフェースとはプロパティからデータを読み取り、またデータをプロパティに書き込むものでもあります。必要なインターフェースを呼び出すためにはそのインターフェース用のGUIDパスをVCDPropertyItems.FindInterfaceクラスライブラリリファレンス>クラス>VCDPropertyItems>VCDPropertyItems.FindInterface Methodへのパラメータとして使用しますが、それを行う前にどのインターフェースを使用するかを決める必要があります。 オート設定の項目の場合( VCDPropertyElementクラスライブラリリファレンス>クラス>VCDPropertyElement, GUID: VCDElement_Auto)の場合、スイッチインターフェース(VCDSwitchPropertyクラスライブラリリファレンス>クラス>VCDSwitchProperty, GUID: VCDInterface_Switch)を取得しようとします。値の項目(実際のプロパティ値)を使う場合は最適なインターフェースを探さなければなりません。最適、あるいはもっとも高度なインターフェースは絶対値(absolute value) インターフェースとなります。
(詳細についてはVCDAbsoluteValuePropertyクラスライブラリリファレンス>クラス>VCDAbsoluteValuePropertyをご参照ください)
最初に説明したように、絶対値インターフェースは高精度で、値がその通りの意味を持つことになります。次のコードは露光時間のプロパティ項目の要素値のための絶対値インターフェースを 取得しています。
[C#]// 絶対値インターフェースの宣言
VCDAbsoluteValueProperty absValItf;
// 露光時間の絶対値インターフェースの取得
absValItf = ICImagingControl1.VCDPropertyItems.1ind<VCDAbsoluteValueProperty>(VCDGUIDs.VCDID_Exposure, VCDGUIDs.VCDElement_Value);
if( absValItf != null )
{
// インターフェースの取得に成功
}
else
{
// このプロパティアイテムのエレメントはありません。
}
絶対値インターフェースがこのプロパティに存在しない場合、マップストリング(map string)インターフェースを取得します。(VCDMapStringsPropertyクラスライブラリリファレンス>クラス>VCDMapStringsProperty, GUID: VCDInterface_MapStrings).絶対値インターフェースほどの正確性はありませんが、意味のある値です。次のコードは露光時間のプロパティ項目の要素値のためのマップストリングインターフェースを取得しています。
[C#]// このインターフェースの宣言
VCDMapStringsProperty mapStringsItf;
// 露光時間インターフェースを呼び出し
mapStringsItf = ICImagingControl1.VCDPropertyItems.Find<VCDMapStringsProperty>(VCDGUIDs.VCDID_Exposure, VCDGUIDs.VCDElement_Value);
if( mapStringItf != null )
{
// インターフェースの 取得に成功 ...
}
else
{
// このプロパティアイテムのエレメントはありません。
}
マップストリングインターフェースがこのプロパティに存在しない場合、レンジ(range)インターフェースを呼び出します。(VCDRangePropertyクラスライブラリリファレンス>クラス>VCDRangeProperty, GUID: VCDInterface_Range). このインターフェースの値に意味はありませんが、マップストリングよりも多くの値を提供することも可能です。 次のコードは露光時間のプロパティ項目の要素値のためのレンジインターフェースを呼び出しています。
[C#]// インターフェースの宣言
VCDRangeProperty rangeItf;
//' 露光時間インターフェースの呼び出し
rangeItf = ICImagingControl1.VCDPropertyItems.Find<VCDRangeProperty>(VCDGUIDs.VCDID_Exposure, VCDGUIDs.VCDElement_Value);
if( rangeItf != null )
{
// インターフェースの 取得に成功 ...
}
else
{
// このプロパティアイテムのエレメントはありません。
}
インターフェースを使う
前のセクションではインターフェースの取得について説明しました。ここではそれを使ってプロパティの情報を取得し、値を設定する方法について説明します。全てのインターフェースが以下のプロパティを提供します。
- Available:インターフェースが利用可能であるかを示します。例えば、トリガープロパティ項目のインターフェースはライ ブ画像を流している間は利用できない可能性があります。
- ReadOnly:インターフェースの値を設定できるかどうかを示します
- Default:デフォルトの値
- Value:インターフェースの値
absolute valueとレンジインターフェースは実際値に設定できる最小と最大の値についての情報を得るためのプロパティが提供されます。絶対値インターフェースは追加として値の物理単位の情報を提供し、マップストリングインターフェースは文字列コレクションを提供し、これが実際値に設定できる可能性のある値の集まりを構成します。
absolute valueインターフェースが呼び出せる場合、インターフェースにアクセスするためのコードは次のようになります。
f( absValItf != null && absValItf.Available )
{
absValItf.Value = (absValItf.RangeMin + absValItf.RangeMax) / 2;
}
プロパティ値の抽出
VCDPropertyItemsクラスライブラリリファレンス>クラス>VCDPropertyItemsには接続されているデバイスの全VCDプロパティ設定を文字列に抽出するためのVCDPropertyItems.Saveクラスライブラリリファレンス>クラス>VCDPropertyItems>VCDPropertyItems.Save Methodが用意されています。プロパティ値はXMLフォーマットで保存されます。よって後に復元する時のためにその文字列をレジストリやファイルに保存することが簡単にできます。XMLへの対応は公式に明記されておらず 予告なく変更される場合があります。全てのプロパティ値を修復するには VCDPropertyItems.Loadクラスライブラリリファレンス>クラス>VCDPropertyItems>VCDPropertyItems.Load Methodを使います。