イメージバッファの輝度値を読み込み、輝度反転処理を施す
概要
ライブ表示した画像を撮影し、イメージバッファのすべてのピクセルに対して輝度値を読み込み、輝度反転させた画像を表示するプログラムです。ピクセル単位で制御するにはこちらのサンプルをもとに改修ください。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | image_processing_cs_3.5.zip |
実行結果
Visual Studioのプログラム上ではすでにボタンの設置や関数は定義済ですので、IC Imaging Contorl3.5をインストールされていれば、実行ボタンだけですぐにデバッグで動作確認することができます。
画面にあるそれぞれのボタンなどのコントローラの機能は下記の通りです。
[Start Live]ボタン | ライブストリームを開始します。 |
---|---|
[Stop Live]ボタン | ライブストリームを停止します。 |
[Process]ボタン | ライブ表示した画像を撮影し、輝度反転させたバッファ画像を表示します。 |
初期設定
private void Form1_Load( object sender, EventArgs e )
{
if( !icImagingControl1.LoadShowSaveDeviceState("lastSelectedDeviceState.xml") )
{
MessageBox.Show("No device was selected.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
return;
}
// カメラの設定した解像度に合わせて表示画面を変更
icImagingControl1.LiveDisplayDefault = false;
icImagingControl1.LiveDisplaySize = icImagingControl1.Size;
cmdStartLive.Enabled = true;
cmdStopLive.Enabled = false;
cmdProcess.Enabled = false;
}
フォームロードするタイミングの処理内容です。
LoadShowSaveDeviceStateメソッドにてデバイスを割り当て、LiveDisplaySizeプロパティを使用することで、カメラの設定した解像度に合わせて表示画面を変更しています。
[Start Live]ボタンをクリックした時の動作
private void cmdStartLive_Click_1( object sender, EventArgs e )
{
// このサンプルはカラー画像で機能するため、シンクタイプを RGB24 に設定します。
icImagingControl1.Sink = new TIS.Imaging.FrameSnapSink(MediaSubtypes.RGB24);
icImagingControl1.LiveStart();
cmdStartLive.Enabled = false;
cmdStopLive.Enabled = true;
cmdProcess.Enabled = true;
}
[Start Live]ボタンをクリックした時のイベントハンドラーです。
LiveStartメソッドを開始する前にFrameSnapSinkメソッドでビデオストリームからフレームを取得するためのSinkタイプを作成します。
シンクとは画像取り込みカメラより送られて来るフレームを受け取り、そこからFrameHandlerSink.ImageBuffersコレクションにコピーするオブジェクトを指します。このサンプルはカラー画像で機能するため、引数に渡すシンクタイプをRGB24に設定します。
[Stop Live]ボタンをクリックした時の動作
[Stop Live]ボタンをクリックした時のイベントハンドラーです。
LiveStopメソッドだけで停止することができます。
private void cmdStopLive_Click( object sender, EventArgs e )
{
icImagingControl1.LiveStop();
cmdStartLive.Enabled = true;
cmdStopLive.Enabled = false;
cmdProcess.Enabled = false;
}
[Save]ボタンをクリックした時の動作
private void cmdProcess_Click( object sender, EventArgs e )
{
//マウスポインタを一時的に待機状態(通常は砂時計のアイコン)にする
Cursor = Cursors.WaitCursor;
try
{
//静止画保存機能が組み込まれたSinkタイプのFrameSnapSinkを使用
FrameSnapSink sink = icImagingControl1.Sink as FrameSnapSink;
//カメラから送られた新しい画像が取得されるのを待ち、取得されたら IFrameQueueBufferにその画像を返します
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;
}
[Process]ボタンをクリックした時のイベントハンドラーです。
静止画保存機能が組み込まれたSinkタイプのFrameSnapSink使用しIFrameQueueBufferはイメージバッファへのインターフェースでFrameQueueSinkとFrameSnapSinkで、イメージバッファを参照する際に使用しています。SnapSingleメソッドを使うことで、カメラから送られた新しい画像が取得されるのを待ち、取得されたらIFrameQueueBufferにその画像を返します。
取得したイメージバッファのすべてのピクセルに対して輝度値を反転させるために、イメージバッファのポインタにアクセスして輝度値255(白色)から現在の輝度値を引き算します。
使用しているカメラの解像度は(1024×768)となりますが、カラーフォーマットはRGB24でBitsPerPixelは24bit(3byte)となっています(24ビットフルカラー(1原色あたり8ビット:256階調))。ピクセル当たりの3byteとなりますので1ライン当たりのByte数(BytesPerLine)は3072となり、イメージバッファのサイズとして3072×768=2,359,296となります。
輝度反転した画像をCreateBitmapCopyでSystem.Drawing.Bitmapオブジェクト形式の画像内容をコピーし、別のフォームに画像を張り付けています。
下記のAPIリファレンスマニュアルにもその他関数などの説明があります。
プログラマーズガイド:画像処理を施す
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル