画像処理を施す

画像処理機能を作成する方法について説明します。
今回のサンプルプログラムのC#用のソースコードはMy Documents/IC Imaging Control 3.5内の以下のディレクトリに格納されています。
samples\C# *\Image Processing


プロジェクトの新規作成

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

フォームに3つのボタンを追加し、 CaptionプロパティをそれぞれStart LiveStop LiveProcessとし、それぞれcmdStartLivecmdStopLivecmdProcessと名前を付けます。
これらのボタンのClickイベントに以下のコードを追加します。

[C#]
private void  cmdStartLive_Click_1( object sender, EventArgs e )
{
     // このサンプルはカラーイメージに働くものですので、sink typeをRGB24に設定します。
    icImagingControl1.Sink = new TIS.Imaging.FrameSnapSink(MediaSubtypes.RGB24);
    icImagingControl1.LiveStart();
    cmdStartLive.Enabled = false;
    cmdStopLive.Enabled = true;
    cmdProcess.Enabled = true;
}

ここで、icImagingControl1にFrameSnapSinkをMediaSubtypes.RGB24として追加しました。
このSinkは新しいフレームを取得するprocessメソッドを使用するのに必要です。

[C#]
private void  cmdStopLive_Click( object sender, EventArgs e )
{
     icImagingControl1.LiveStop();
     cmdStartLive.Enabled = true;
     cmdStopLive.Enabled = false;
     cmdStartLive.Enabled = false;
}


[C#]
private void  cmdProcess_Click( object sender, EventArgs e )
{
    Cursor = Cursors.WaitCursor;
    try
    {
        FrameSnapSink sink = icImagingControl1.Sink as FrameSnapSink;
        IFrame imgBuffer = sink.SnapSingle( TimeSpan.FromSeconds( 5 ) );
        var frameType = imgBuffer.FrameType;
        unsafe
        {
            byte* pDatabyte = imgBuffer.Ptr;
            for( int y = 0; y < frameType.Height; y++ )
            {
                for (int x = 0; x < frameType.BytesPerLine; x++ )
                {
                    *pDatabyte = (byte)(255 - *pDatabyte);
                    pDatabyte++;
                }
            }
        }
        if( _displayForm == null || _displayForm.IsDisposed )
        {
            _displayForm = new Form();
        }
        _displayForm.BackgroundImage = imgBuffer.CreateBitmapCopy();
        _displayForm.Size = frameType.Size;
        _displayForm.Show();
    }
    catch( Exception ex )
    {
        MessageBox.Show( ex.Message );
    }
    Cursor = Cursors.Default;
}

sinkからフレームを取得するために、cmdStartLiveハンドラを追加しました。
輝度反転させるために_displayFormの中でフレームを取得して、変化させたフレームを表示させています。

カラーフォーマットを使用する

ピクセルあたりのデータが8bitを超えるビデオフォーマットが選択された場合でも、イメージバッファの1ラインあたりのピクセル数は変わらず同じではあります。しかしそのピクセルあたりのデータが 1byteを超えますので、バッファのサイズは大きくなります。例えばそのビデオフォーマットがRGB24(640x480)でピクセルあたり 3 byteであるとすればイメージバッファのサイズとしては1920x480バイトと同じになります。
RGB24では、ピクセルデータは次の通りに解読されます。: 行の1つめのバイトが最初のピクセルのBlueの値、2つめのバイトが同ピクセルのGreenの値、3つめのバイトが同ピクセルのRedの値、そして4つめのバイトが次のピクセルのBlueの値...となります。
処理によって、次のような画像を得ることが可能です。