イベントを使ってバッファを表示させる
ここでは、FrameQueuSinkを使ってイメージバッファの表示をコントロールする方法について説明します。
通常、IC Imaging Control はコントロールウィンドウ内で自動的にライブ表示を行いますが、ICImagingContorl.LiveDisplayクラスライブラリリファレンスクラス>ICImagingControl>ICImagingControl.LiveDisplay Propertyを無効にすることで、コントロールウィンドウに変更されたバッファを表示することができます。
今回のサンプルプログラムのC#用のソースコードはMy Documents/IC Imaging Control 3.5内の以下のディレクトリに格納されています。
samples\C# *\Display Buffer
プロジェクトの新規作成
新しいプロジェクトを作成し、IC imaging Controlをフォームに追加してください。プログラムを実行する前に、はじめに: Visual Studio .NETプログラマーズガイド>Visual Studioでスタートにあるように映像デバイスの選択、入力方式、ビデオフォーマットを選択してください。もしくはデバイスを選択せずにプログラムを実行してください。その際はIC Imaging Controlによってデバイス選択のダイアログが出現します。選択をせずにダイアログを閉じた場合、プログラムはエラーメッセージを表示し、終了します。
バッファの量を指定する
FrameQueueSinkでは、複数のバッファを利用することができます。バッファの量を多くすることで処理中のデータを上書きされる可能性が低くなります。
一方、当然ですが必要とされるメモリー領域が大きくなります。最適なバッファ量は実際の使用によって調整する必要があります。
このサンプルでは単に表示のみ行っているのでバッファ量を2や3としても良いのですが、余裕を見て5と指定しています。この値を小さくしすぎると処理が追い付かない場合にフレームドロップが発生することとなります。
自動ライブ表示を無効にする
プロパティブラウザ、またはForm1_Loadの中で LiveDisplayクラスライブラリリファレンスクラス>ICImagingControl>ICImagingControl.LiveDisplay PropertyをFalseに設定します。これでIC Imaging Controlが自動的にライブストリームを表示しないようにします。
初期化コードを追加する
Form_Loadイベントプロシージャを作成し、以下のコードを付け足します。
private void Form1_Load( object sender, EventArgs e )
{
if( !icImagingControl1.LoadShowSaveDeviceState("lastSelectedDeviceState.xml") )
{
MessageBox.Show(" デバイスが選択されていません。", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
return;
}
// ディスプレイサイズを変更してビデオをフルコントロールサイズにストレッチします
icImagingControl1.LiveDisplayDefault = false;
icImagingControl1.LiveDisplaySize = icImagingControl1.Size;
cmdStop.Enable = false;
icImagingControl1.LiveDisplay = false;
InitSink();
}
まず、以前に使用されたデバイスか、新しいデバイスを選択します。
ControlName.LiceDisplaySize = ControlName.Sizeによって、 表示イメージをコントロールのサイズにストレッチします。
ControlName.LiveDisplay = false によってライブビデオを無効にすることで、DisplayImageBufferによってコントロールにそのバッファを表示できるようになります。
InitSinkをコールすることで、コールバックを使用できるSinkを初期化します。
新しいイメージに対するイベント
ここで、Sinkを初期化するためのInitSinkを追加します。
private void InitSink()
{
icImagingControl1.Sink = new FrameQueueSink(ShowBuffer, MediaSubtypes.RGB32, 5);
}
ここでFrameQueueSinkを作成され、新しいフレーム毎にShowBufferがコールされます。
このSinkは、5フレームのQueueサイズを持ち、MediaSubtypes.RGB32イメージバッファのみ受け付けます。
では、新しいフレーム毎にコールされるShowBuggerメソッドを追加しましょう。
private FrameQueuedResult ShowBuffer( IFrameQueueBuffer buffer )
{
try
{
icImagingControl1.DisplayImageBuffer( buffer );
}
catch( Exception ex )
{
SystemDiagnostics.Trace.WriteLine( ex.Message );
}
return FrameQueueResult.ReQueue;
}
このメソッドは新しいフレームが入力される毎にコールされます。この中で、ICImagingControl.DisplayImageBufferによってフレームを取得してバックバッファにその内容をコピーします。 その後FrameQueuedResult.ReQueueはIFrameQueueBufferに再びキューが可能である事を知らせます。
Start/Stop コマンドの実装
フォームにボタンを2つ追加し、そのcaptionを"Start"と"Stop"とします。また、そのNameをそれぞれ"cmdStart" と"cmdStop"とします。
private void cmdStart_Click( object sender, EventArgs e )
{
icImagingControl1.LiveStart();
cmdStart.Enabled = false;
cmdStop.Enabled = true;
}
private void cmdStop_Click( object sender, EventArgs e )
{
cmdStart.Enabled = true;
cmdStop.Enabled = false;
icImagingControl1.LiveStop();
icImagingControl1.DisplayImageBufferClear();
}