イメージデータへのアクセス
概要
ICImagingControlを使ってどのようにイメージデータにアクセスするかを示しています。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | accessing_image_data_cs_3.5.zip |
サンプルツールの外観
ビデオキャプチャデバイスから取得されたイメージデータはライブ表示され、同時にICImagingControlのリングバッファにコピーされます。マウスカーソルがライブビデオ上にある時、その場所のRGBカラーの輝度値を表示します。
private TIS.Imaging.FrameSnapSink _fhs;
private void Form1_Load(object sender, System.EventArgs e)
{
icImagingControl1.ShowDeviceSettingsDialog();
if( !icImagingControl1.DeviceValid )
{
Close();
return;
}
_fhs = new TIS.Imaging.FrameSnapSink(TIS.Imaging.MediaSubtypes.RGB24);
icImagingControl1.Sink = _fhs;
icImagingControl1.LiveStart();
}
プログラム開始時にicImagingControl1.ShowDeviceSettingsDialogをコールしてデバイス選択ダイアログを表示します。使用されるビデオデバイスが選択されると、icImagingControl1.LiveStartをコールしてイメージストリームを開始します。FrameSnapSinkを使用することによりイメージストリームのデータはすべて連続してリングバッファにコピーされるようになります。
MediaSubtypes.RGB24によりイメージデータが RGB24 format であることを明示的に確認しています。
private void icImagingControl1_MouseMove(object sender, MouseEventArgs e)
{
lblCoords.Text = e.X + "," + e.Y;
TIS.Imaging.IFrameQueueBuffer rval = _fhs.SnapSingle(TimeSpan.FromSeconds(1));
BufferAccessHelper buf = new BufferAccessHelper(rval);
int indexXred = e.X * 3 + 2;
int indexXgreen = e.X * 3 + 1;
int indexXblue = e.X * 3;
int indexY = rval.FrameType.Height - e.Y- 1;
byte red = buf[indexXred, indexY];
byte green = buf[indexXgreen, indexY];
byte blue = buf[indexXblue, indexY];
if (e.X < rval.FrameType.Width && e.Y < rval.FrameType.Height)
{
txtImageData.Text = string.Format( "Red\t= {0}\r\nGreen\t= {1}\r\nBlue\t= {2}", red, green, blue );
}
else
{
txtImageData.Text = "<Outside of image>";
}
}
IFrameQueueBufferの変数rvalはマウス移動イベントハンドラーの中で宣言され、最新のイメージデータへのアクセスに使用されます。最新のイメージデータはプロパティBufferAccessHelperをコールする事で取得する事ができます。このサンプルではBufferAccessHelperが使用されており、マウス移動イベントハンドラーの中でコールされ、輝度データの取得に使用されています。
class BufferAccessHelper
{
TIS.Imaging.IFrameQueueBuffer buf;
public BufferAccessHelper(TIS.Imaging.IFrameQueueBuffer buf)
{
this.buf = buf;
}
public unsafe byte this[int x, int y]
{
get
{
byte* ptr = buf.Ptr + y * buf.FrameType.BytesPerLine + x;
return *ptr;
}
set
{
byte* ptr = buf.Ptr + y * buf.FrameType.BytesPerLine + x;
*ptr = value;
}
}
}
BufferAccessHelperクラスによりマウスの位置の輝度データにアクセスします。RGB24イメージバッファでは、データとして画像データが逆さまに配置されている事に注意が必要です。バッファデータの行0はイメージの最終行を示します。それぞれの行の最初の値は青、続いて緑、赤とデータが並んでいます。その次は2ピクセル目の青になります。上記のコードの様に該当ピクセルのRGB値を抜き出す事ができます。