イベントを使ってバッファを表示させる

ここでは、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 PropertyFalseに設定します。これでIC Imaging Controlが自動的にライブストリームを表示しないようにします。

初期化コードを追加する

Form_Loadイベントプロシージャを作成し、以下のコードを付け足します。

[C#]
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を追加します。

[C#]
private void InitSink()
{
    icImagingControl1.Sink = new FrameQueueSink(ShowBuffer, MediaSubtypes.RGB32, 5);
}

ここでFrameQueueSinkを作成され、新しいフレーム毎にShowBufferがコールされます。
このSinkは、5フレームのQueueサイズを持ち、MediaSubtypes.RGB32イメージバッファのみ受け付けます。

では、新しいフレーム毎にコールされるShowBuggerメソッドを追加しましょう。

[C#]
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"とします。

[C#]
private void cmdStart_Click( object sender, EventArgs e )
{
     icImagingControl1.LiveStart();
     cmdStart.Enabled = false;
     cmdStop.Enabled = true;
}

[C#]
private void cmdStop_Click( object sender, EventArgs e )
{
    cmdStart.Enabled = true;
    cmdStop.Enabled = false;
    icImagingControl1.LiveStop();
    icImagingControl1.DisplayImageBufferClear();
}