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

mageAvailableイベントによってイメージバッファの表示をコントロールする方法について説明します。
通常、IC Imaging Control はコントロールウィンドウ内で自動的にライブ表示を行いますが、ImageAvailable イベントを使うことでこの設定を変更することができます。これによって表示をする前にアプリケーションがバッファ内の画像データに処理を加えることができるようになります。
今回のサンプルプログラムのVB.NET 、C#用のソースコードはMy Documents/IC Imaging Control 3.4内の以下のディレクトリに格納されています。
samples\VB *\Display Buffer
samples\C# *\Display Buffer

プロジェクトの新規作成

新しいプロジェクトを作成し、IC imaging Controlをフォームに追加してください。プログラムを実行する前に、 はじめに: Visual Studio .NETプログラマーズガイド>Visual Studioでスタート にあるように映像デバイスの選択、入力方式、ビデオフォーマットを選択してください。もしくはデバイスを選択せずにプログラムを実行してください。その際はIC Imaging Controlによってデバイス選択のダイアログが出現します。選択をせずにダイアログを閉じた場合、プログラムはエラーメッセージを表示し、終了します。

リングバッファのサイズを指定する

複数のイメージバッファを活用するプログラマーズガイド>複数のバッファを活用するにて説明したように、IC Imaging Control はリングバッファという配列で複数のバッファを管理しています。リングバッファ内にあるバッファの数はプロパティブラウザ内でImageRingBufferSizeクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.ImageRingBufferSize Propertyプロパティをクリックすることで指定することができます。バッファの容量が大きければ処理中のデータを上書きされる可能性は低くなりますが、一方でバッファが大きくなればそれだけメモリーの領域も多く必要になります。最適なリングバッファの容量はこれらの点のバランスを取って決定する必要があります。弊社のアプリケーションではバッファにて画像処理は行われない 為、最適なリングバッファのサイズは5となっております。

自動ライブ表示を無効にする

プロパティブラウザで LiveDisplayクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveDisplay PropertyFalseに設定します。 これでIC Imaging Control が自動的にライブストリームを表示しないようにできます。

連続キャプチャモードを有効にする

連続キャプチャモードを有効にするためには、プロパティブラウザで  LiveCaptureContinuousクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveCaptureContinuous PropertyTrueに設定します。このモードでは自動的に全てのフレームがリングバッファにコピーされるようになります。また、リングバッファへのフレームのコピーが完了するごとにImageAvailableイベントが送られるようになります。

初期化コードを追加する

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

[VB.NET]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' 有効な画像取り込みデバイスが選択されているかをチェック。
    ' もしされていなければImaging Controlのデバイス選択ダイアログを表示する。
    If Not IcImagingControl1.DeviceValid Then
         IcImagingControl1.ShowDeviceSettingsDialog()

         If Not IcImagingControl1.DeviceValid Then
             MessageBox.Show("No device was selected.", "Display Buffer Sample")
             Me.Close()
             Exit Sub
         End If
   End If

   cmdStop.Enabled = false
   IcImagingControl1.Width = IcImagingControl1.ImageWidth
   IcImagingControl1.Height = IcImagingControl1.ImageHeight
End Sub
[C#]
private void Form1_Load(object sender, EventArgs e)
{
     // 有効な画像取り込みデバイスが選択されているかをチェック。
     // もしされていなければImaging Controlのデバイス選択ダイアログを表示する。
     if (!icImagingControl1.DeviceValid)
     {
         icImagingControl1.ShowDeviceSettingsDialog();

           if (!icImagingControl1.DeviceValid)
         {
             MessageBox.Show(""No device was selected.", "Display Buffer",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
             this.Close();
             return;         }
    }

    cmdStop.Enabled = false;
    icImagingControl1.LiveDisplayDefault = false;
    icImagingControl1.LiveDisplayHeight = icImagingControl1.Height;
    icImagingControl1.LiveDisplayWidth = icImagingControl1.Width;

    icImagingControl1.LiveCaptureContinuous = true;
    icImagingControl1.LiveDisplay = false;
}

これは選択された画像取り込みデバイスが有効な場合に"Start" ボタンだけを有効にします。
次の ControlName.Width = ControlName.ImageWidthを含む行は選択されたビデオフォーマットによって指定されたコントロールのサイズを設定します。

Start/Stop コマンドの実装

フォームにボタンを追加し、キャプションプロパティを "Start" 、名前を "cmdStart" とします。そして次のコードをクリックイベントプロシージャに追加します。

[VB.NET]
Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
     IcImagingControl1.LiveStart()
     cmdStart.Enabled = False
     cmdStop.Enabled = True
End Sub
[C#]
private void cmdStart_Click(object sender, EventArgs e)
{
     icImagingControl1.LiveStart();
     cmdStart.Enabled = false;
     cmdStop.Enabled = true;
}

フォームに二つ目のボタンを追加します。キャプションプロパティを "Stop"  、名前を "cmdStop"とします。そして次のコードをクリックイベントプロシージャに追加します。

[VB.NET]
Private Sub cmdStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStop.Click
     cmdStart.Enabled = True
     cmdStop.Enabled = false
     IcImagingControl1.LiveStop()
End Sub
[C#]
private void cmdStop_Click(object sender, EventArgs e)
{
     cmdStart.Enabled = true;
     cmdStop.Enabled = false;
     icImagingControl1.LiveStop();
}

ImageAvailable イベントプロシージャ

では、ImageAvailable イベントプロシージャをコードに追加します。

イベントプロシージャに次のコードを挿入します。

[VB.NET]
Private Sub IcImagingControl1_ImageAvailable(ByVal sender As System.Object, 
 ByVal e As TIS.Imaging.ICImagingControl.ImageAvailableEventArgs) Handles IcImagingControl1.ImageAvailable
    Try
         Dim CurrentBuffer As TIS.Imaging.ImageBuffer

         CurrentBuffer = IcImagingControl1.ImageBuffers(e.bufferIndex)
         IcImagingControl1.DisplayImageBuffer(CurrentBuffer)

     Catch ex As System.Exception
         System.Diagnostics.Trace.WriteLine(ex.Message)
     End Try
End Sub
[C#]
private void icImagingControl1_ImageAvailable
(object sender, TIS.Imaging.ICImagingControl.ImageAvailableEventArgs e)
{
     try
     {
         TIS.Imaging.ImageBuffer CurrentBuffer = null;

        CurrentBuffer = icImagingControl1.ImageBuffers[e.bufferIndex];
        icImagingControl1.DisplayImageBuffer(CurrentBuffer);
     }
     catch (Exception ex)
     {
         System.Diagnostics.Trace.WriteLine(ex.Message);
     }
}

ImageAvailableイベントハンドラがパラメータe.内のイベントアーギュメントImageAvailableEventArgsクラスライブラリリファレンス>クラス>ImageAvailableEventArgsを受け取ります。ImageAvailableEventArgs.bufferIndexクラスライブラリリファレンス>クラス>ImageAvailableEventArgs>ImageAvailableEventArgs.bufferIndex Propertyが最後にコピーされた画像を保持するバッファを特定します。そしてこのイメージバッファはローカル変数CurrentBufferに割り当てられます。バッファはICImagingControl.DisplayImageBufferクラスライブラリリファレンス>クラス>ICImagingControl>CImagingControl.DisplayImageBuffer Methodを呼び出すことで表示されます。そのイメージバッファが表示される前に処理を行うことも可能です。