画像処理を施す
画像処理機能を作成する方法について説明します。
今回のサンプルプログラムの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 Live、Stop Live、Processとし、それぞれcmdStartLive、cmdStopLive、cmdProcessと名前を付けます。
これらのボタンのClickイベントに以下のコードを追加します。
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メソッドを使用するのに必要です。
private void cmdStopLive_Click( object sender, EventArgs e )
{
icImagingControl1.LiveStop();
cmdStartLive.Enabled = true;
cmdStopLive.Enabled = false;
cmdStartLive.Enabled = false;
}
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の値...となります。
処理によって、次のような画像を得ることが可能です。