ソフトウェアトリガーで画像を表示・保存
このサンプルは、ソフトウェアトリガーで画像を保存する方法を示しています。
Software | IC Imaging Control 3.4, Visual Studio™ 2019 |
---|---|
サンプル(C#) | SoftwareTrigger.zip |
Download VB.net sample | SoftwareTrigger_vb.zip |
DeviceTriggerでトリガーモードをオンにし、ライブスタートします。トリガーモード中、外部トリガー信号あるいはソフトウェアトリガー信号を入力しない限りカメラは画像を転送しません。MemorySnapImageなどを使用して順次処理をした場合、トリガーを待つ間ずっとプログラム処理が待ち状態になってしまうため、ImageAvaiableなどのコールバック関数を使用することを推奨しています。
下記のような手順でソフトウェアトリガーを入力することができます。
Software TriggerのVDCPropertyのPushメソッドを使用するために、FindInterfaceメソッドの引数にインターフェースパスをパラメーターとして渡しSoftware Triggerプロパティにアクセスします。ソフトウェアトリガーが入力されたタイミングでライブ表示、画像を取得、画像保存などの連続キャプチャモード(ImageAvailableイベント)を有効にするために、プロパティでLiveCaptureContinuousをTrueに設定します。このモードでは自動的に全てのフレームがリングバッファにコピーされるようになります。また、 リングバッファへのフレームのコピーが完了するごとにImageAvailableイベントが送られるようになります。また、ライブストップした最後のフレームを保存し表示しないためにオフにし、ImageAvailableイベントハンドラーが生じたときにLiveDisplayするようにするためにライブ画像を明示的にオフにします。
SoftwareTrigger = (VCDButtonProperty)icImagingControl1.VCDPropertyItems.
FindInterface(VCDIDs.VCDID_TriggerMode,
VCDIDs.VCDElement_SoftwareTrigger,
VCDIDs.VCDInterface_Button);//宣言
icImagingControl1.DeviceTrigger = true;//トリガーモードオン
icImagingControl1.LiveCaptureContinuous = true; // ImageAvailableイベントを呼ぶ
icImagingControl1.LiveCaptureLastImage = false; // ライブストップした最後のフレームを保存しない
icImagingControl1.LiveDisplay = false; //ライブ画像を表示しない
icImagingControl1.LiveStart();//ライブスタート
//SoftwareTrigger.Push(); // クリックタイミング以外にもソフトウェアトリガーを使用してもOK
トリガーで使用するプロパティ(Debounce Time , Trigger mak Time, Delay, Burst Count等)の設定は下記のように、それぞれのVCDプロパティのインターフェースを取得し、値やプロパティの自動設定などのエレメントを調節してください。
※カメラによって実装されている機能とされていない機能があります。設定可能なVCDプロパティの確認方法は下記を参照ください。
VCDpropertyの設定方法
IC Imaging Control_Ver3.4(C#/VB.NET) サンプルプログラム
//ExposureMode宣言
ExposureMode = (VCDMapStringsProperty)icImagingControl1.VCDPropertyItems.
FindInterface(VCDIDs.VCDID_TriggerMode,
"{B6E013CA-76C7-4DDD-9AC8-A17E07C5E3F1}",
VCDIDs.VCDInterface_MapStrings);//
//トリガーDelay宣言
TriggerDelay = (VCDAbsoluteValueProperty)icImagingControl1.VCDPropertyItems.
FindInterface(VCDIDs.VCDID_TriggerMode,
VCDIDs.VCDElement_TriggerDelay,
VCDIDs.VCDInterface_AbsoluteValue);
//DebounceTime宣言;
TriggerDebounceTime = (VCDAbsoluteValueProperty)icImagingControl1.VCDPropertyItems.
FindInterface(VCDIDs.VCDID_TriggerMode,
VCDIDs.VCDElement_TriggerDebounceTime,
VCDIDs.VCDInterface_AbsoluteValue);
//MaskTime宣言
TriggerMaskTime = (VCDAbsoluteValueProperty)icImagingControl1.VCDPropertyItems.
FindInterface(VCDIDs.VCDID_TriggerMode,
VCDIDs.VCDElement_TriggerMaskTime,
VCDIDs.VCDInterface_AbsoluteValue);
//NoiseSuppressionTime宣言
TriggerNoiseSuppressionTime = (VCDAbsoluteValueProperty)icImagingControl1.VCDPropertyItems.
FindInterface(VCDIDs.VCDID_TriggerMode,
VCDIDs.VCDElement_TriggerNoiseSuppressionTime,
VCDIDs.VCDInterface_AbsoluteValue);//トリガーDelay宣言;
//BurstCount宣言;
TriggerBurstCount = (VCDRangeProperty)icImagingControl1.VCDPropertyItems.
FindInterface(VCDIDs.VCDID_TriggerMode,
"{B4109964-77E4-4AF3-ACA8-45BBAA861B5C}",
VCDIDs.VCDInterface_Range);
//BurstInterval宣言;
TriggerBurstInterval = (VCDRangeProperty)icImagingControl1.VCDPropertyItems.
FindInterface(VCDIDs.VCDID_TriggerMode,
"{A9715AB3-69AE-454D-8DF5-7E06D87C109C}",
VCDIDs.VCDInterface_Range);
Pushメソッドを呼び出すことで簡単にソフトウェアトリガーを入力することができます。
private void Button1_Click(object sender, EventArgs e){
SoftwareTrigger.Push(); // ソフトウェアトリガーを入力
}
ソフトウェアトリガーを入力したタイミングでリングバッファへのフレームのコピーが完了し、ImageAvailableイベントハンドラが呼び出されます。
ImageAvailableイベントハンドラがパラメータe.内のイベントアーギュメントImageAvailableEventArgsを受け取り、ImageAvailableEventArgs.bufferIndexが最後にコピーされた画像を保持するバッファをローカル変数CurrentBufferに割り当て、バッファはICImagingControl.DisplayImageBufferを呼び出すことで表示することができます。
また、SaveAsJpegメソッドでバッファをJPEG形式などで保存することもできます。
private void IcImagingControl1_ImageAvailable(object sender, ICImagingControl.ImageAvailableEventArgs e){
ImageBuffer CurrentBuffer = null;//CurrentBufferの初期化
CurrentBuffer = icImagingControl1.ImageBuffers[e.bufferIndex];//イメージバッファの取得
icImagingControl1.DisplayImageBuffer(CurrentBuffer);//バッファを表示
//バッファの内容をJPEGファイルとしてディスクに保存します
string filename = String.Format("test{0}.jpg", counter);
CurrentBuffer.SaveAsJpeg(filename, 70);
counter++;
}