イメージデータへのアクセス
ICImagingControlを使ってどのようにイメージデータにアクセスするかを示しています。
Software | IC Imaging Control 3.4, Visual Studio™ 2019 |
---|---|
サンプル(C#) | accessing_image_data_cs_3.4.zip |
ビデオキャプチャデバイスから取得されたイメージデータはライブ表示され、同時にICImagingControlのリングバッファにコピーされます。マウスカーソルがライブビデオ上にある時、その場所のRGBカラーの輝度値を表示します。
プログラム開始時にicImagingControl1.ShowDeviceSettingsDialogをコールしてデバイス選択ダイアログを表示します。使用されるビデオデバイスが選択されると、icImagingControl1.LiveStartをコールしてイメージストリームを開始します。icImagingControl1.LiveCaptureContinuousをTrueにセットすることにより、イメージストリームのデータはすべて連続してリングバッファにコピーされるようになります。
.MemoryCurrentGrabberColorformat = ICRGB24によりイメージデータが RGB24 format であることを明示的に確認しています。
private void Form1_Load(object sender, System.EventArgs e)
{
icImagingControl1.ShowDeviceSettingsDialog();
if( !icImagingControl1.DeviceValid )
{
Close();
return;
}
icImagingControl1.LiveCaptureContinuous = true;
icImagingControl1.MemoryCurrentGrabberColorformat = TIS.Imaging.ICImagingControlColorformats.ICRGB24;
icImagingControl1.LiveStart();
}
TIS.Imaging.ImageBufferの変数ibはマウス移動イベントハンドラーの中で宣言され、最新のイメージデータへのアクセスに使用されます。最新のイメージデータはプロパティ icImagingControl1.ImageActiveBufferをコールする事で取得する事ができます。イメージデータの上書きから保護するため、イメージバッファはib.Lock()をコールしてロックする必要があります。このサンプルでは GetImageColorValueRGB24()が使用されており、マウス移動イベントハンドラーの中でコールされ、輝度データの取得に使用されています。
private void icImagingControl1_MouseMove(object sender, MouseEventArgs e)
{
lblCoords.Text = e.X + "," + e.Y;
TIS.Imaging.ImageBuffer ib = icImagingControl1.ImageActiveBuffer;
ib.Lock();
if( e.X < ib.PixelPerLine && e.Y < ib.Lines )
{
byte red, green, blue;
getImageColorValueRGB24( ib, e.X, e.Y, out red, out green, out blue );
txtImageData.Text = string.Format( "Red\t= {0}\r\nGreen\t= {1}\r\nBlue\t= {2}", red, green, blue );
}
else
{
txtImageData.Text = "<Outside of image>";
}
ib.Unlock();
}
関数GetImageColorValueRGB24()によりマウスの位置の輝度データにアクセスします。RGB24イメージバッファでは、データとして画像データが逆さまに配置されている事に注意が必要です。バッファデータの行0はイメージの最終行を示します。それぞれの行の最初の値は青、続いて緑、赤とデータが並んでいます。その次は2ピクセル目の青になります。以下のコードの様に該当ピクセルのRGB値を抜き出す事ができます。
private void getImageColorValueRGB24( TIS.Imaging.ImageBuffer ib, int x, int y, out byte red, out byte green, out byte blue )
{
int indexXred = x * 3 + 2;
int indexXgreen = x * 3 + 1;
int indexXblue = x * 3;
int indexY = ib.Lines - y - 1;
red = ib[ indexXred, indexY ];
green = ib[ indexXgreen, indexY ];
blue = ib[ indexXblue, indexY ];
}