任意のタイミングで画像処理と静止画保存を同時に処理
概要
ICImagingControlを使用してTheImagingSourceのデバイスで取得できる映像をリアルタイムに表示しながら、任意のタイミングで画像処理を行い、画像処理結果を静止画保存するためのサンプルプログラムです。FrameSnapsinkがメインのAPIです。
処理内容とタイミング | 1.ライブ表示のみ | 2.静止画保存 | 3.任意のタイミングで画像処理と静止画保存を同時に処理 | 4.録画しながら任意のタイミングで静止画保存 | 5.全フレームリアルタイム画像処理しながら、NG判定を静止画保存 | 6.全フレームリアルタイム画像処理しながらNG判定を静止画保存、同時に録画 | |
---|---|---|---|---|---|---|---|
処理タイミング
|
ライブ 表示 |
〇 LiveDisplay | 〇 LiveDisplay | 〇 LiveDisplay | 〇 LiveDisplay | - | - |
画像 処理 |
× | × | 〇 SnapSingle | × | - | - | |
静止画 保存 |
× | 〇 SnapSingle | 〇 SnapSingle |
〇
SetStringParameter (FrameFilter) |
- | - | |
動画 保存 |
× | × | × |
〇
LiveStart (MediaStreamSink) |
- | - | |
処理タイミング
|
ライブ 表示 |
- | - | - | - | 〇 DisplayImageBuffer | 〇 DisplayImageBuffer |
画像 処理 |
- | - | - | - | 〇 FrameQueueSinkQueueSink | 〇 FrameQueueSinkQueueSink | |
静止画 保存 |
- | - | - | - |
〇
SaveAsBitmap (コールバック関数内で定義) |
〇
SaveAsBitmap (コールバック関数内で定義) |
|
動画 保存 |
- | - | - | - | × | 〇 Windows API | |
メインになる ICImagingControl Sinkクラス |
FrameNotificationSink | FrameSnapsink | FrameSnapsink | MediaStreamSink | FrameQueueSink | FrameQueueSink | |
使用例 | 拡大観察してモニター表示しているものを作業者がモニターで目視チェック。 | モニター表示による拡大観察と作業者による画像保存操作。 | オフラインでの寸法測定と測定画像の保存。 | オフラインでの寸法測定と測定画像の保存と作業内容の録画。 | インラインの画像検査。NG判定画像保存でトレサビ管理。 | インラインの画像検査。NG判定画像保存でトレサビ管理と、録画によるラインの監視。 | |
sinkのオブジェクトが用意している コールバック関数 |
有り (コールバック関数はあるが全フレーム取得は保証されていない) |
無し | 無し | 無し | 有り | 有り | |
Sinkの切り替え | 無し | 無し | 無し | 有り | 無し | 無し |
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | multi_process3_cs_3.5.zip |
サンプルツールの外観
フォームを立ち上げたときのイベント
private void Form1_Load(object sender, System.EventArgs e)
{
// ディスプレイのサイズを調整
icImagingControl1.LiveDisplayDefault = false;
icImagingControl1.LiveDisplaySize = icImagingControl1.Size;
icImagingControl1.Sink = new TIS.Imaging.FrameSnapSink();
}
まず、ICImagingControlのコントロールパネルのサイズを合わせるためにLiveDisplayDefault プロパティでfalseに設定しています。 次にicImagingControl1コントロールのSinkプロパティに、新しいTIS.Imaging.FrameSnapSinkオブジェクトを設定します。これにより、FrameSnapSinkがフレームキャプチャを実行し、フレームを取得することが可能となります。
[デバイス選択 ShowDeviceSettingsDialog]ボタンをクリックしたときの処理
private void cmdSelectDevice_Click(object sender, EventArgs e)
{
// The device settings dialog needs the live mode to be stopped
if (icImagingControl1.LiveVideoRunning)
{
icImagingControl1.LiveStop();
}
// デバイスダイアログを表示する
icImagingControl1.ShowDeviceSettingsDialog();
icImagingControl1.LiveStart();
}
[デバイス選択 ShowDeviceSettingsDialog]ボタンをクリックしたときのイベントです。最初にライブモードが停止していること(LiveStartメソッドを呼んでいないこと)を確認するために、LiveVideoRunningプロパティを確認しています。ShowDeviceSettingsDialogメソッドを呼び出して、下図のようなデバイス設定ダイアログを表示し、ダイアログにてカメラの選択、ビデオフォーマットの設定、フレームレートの設定を行い、OKを押下してデバイス設定ダイアログを閉じます。その後、icImagingControl1.LiveStart();にてカメラのリアルタイムの映像を画面に表示します。
[プロパティ ShowPropertyDialog]ボタンをクリックしたときの処理
private void cmdShowOriginalDialog_Click(object sender, EventArgs e)
{
icImagingControl1.ShowPropertyDialog();
}
[プロパティ ShowPropertyDialog]ボタンをクリックしたときのイベントです。下図のようなIC Imaging Controlのプロパティダイアログを表示します。プロパティダイアログには、カメラのゲイン、露光時間、ホワイトバランス、明るさ、コントラストなどのカメラの機能に関する設定が含まれており、それらの設定をプロパティダイアログ上で変更することができます。
[画面表示ON LiveDisplay=True]ボタンをクリックしたときの処理
private void cmdDisplayON_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStop();
icImagingControl1.LiveDisplay = true;
icImagingControl1.LiveStart();
}
[画面表示ON LiveDisplay=True]ボタンを押下したときのイベントです。フォーム上のICImagingControlのコントロール(画面上)にカメラの映像を表示させるか、または非表示にするか切り替えるために使用されます。LiveStartの呼び出し中は画面表示のON/OFFを切り替えることができないので、上記のようにまずLiveStopをしてライブストリーミングを停止し、LiveDisplayのプロパティにTrue/Falseを変更した後、LiveStartを再度呼び出しています。
[画面表示OFF LiveDisplay=False]ボタンをクリックしたときの処理
private void cmdDisplayOFF_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStop();
icImagingControl1.LiveDisplay = false;
icImagingControl1.LiveStart();
}
[画面表示OFF LiveDisplay=False]ボタンを押下したときのイベントです。フォーム上のICImagingControlのコントロール(画面上)にカメラの映像を表示させるか、または非表示にするか切り替えるために使用されます。LiveStartの呼び出し中は画面表示のON/OFFを切り替えることができないので、上記のようにまずLiveStopをしてライブストリーミングを停止し、LiveDisplayのプロパティにTrue/Falseを変更した後、LiveStartを再度呼び出しています。
[ライブスタート LiveStart(FrameSnapSink)]ボタンをクリックしたときの処理
private void cmdLiveStartFrameSnapSink_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStart();
}
上記はIC Imaging ControlのLiveStartを定義したものです。cmdLiveStartFrameSnapSink_Clickメソッドは、[ライブスタート LiveStart(FrameSnapSink)]ボタンがクリックされたときに呼び出されます。LiveStartメソッドは、カメラからのライブストリーミングを開始します。ライブストリーミングが開始されたかどうかは、画面右上部にあるカウンターがカウントアップしていることで確認できます。なお、LiveDisplay = falseの場合には画面上に映像が映りませんが、カメラからは画像フレームをPCに出力するという動作を開始しています。
[画像処理開始 SingleSnap]ボタンをクリックしたときの処理
private void btnSaveBMP_ImageProcess_Click(object sender, EventArgs e)
{
TIS.Imaging.FrameSnapSink snapSink = icImagingControl1.Sink as TIS.Imaging.FrameSnapSink;
TIS.Imaging.IFrameQueueBuffer frm = snapSink.SnapSingle(TimeSpan.FromSeconds(5));
System.Drawing.Bitmap bmp = FrameExtensions.CreateBitmapCopy(frm);
// 画像処理の例:輝度反転
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
Color c = bmp.GetPixel(x, y);
int r = 255 - c.R;
int g = 255 - c.G;
int b = 255 - c.B;
bmp.SetPixel(x, y, Color.FromArgb(c.A, r, g, b));
}
}
bmp.Save(""output.bmp"");
}
フレームをスナップショットし、ビットマップに変換してから、単純な画像処理を行い、最終的にビットマップを保存する処理を行っています。
まず、IC Imaging ControlのFrameSnapSinkオブジェクトを使用して、ビデオフレームを取得します。SnapSingleメソッドは、指定された時間内に1つのフレームをスナップショットするために使用されます。ここでは、5秒間待機してフレームをキャプチャしています。
次に、画像処理しやすい形式にするためにIFrameQueueBufferオブジェクトを取得し、FrameExtensions.CreateBitmapCopyメソッドを使用して、ビットマップ形式に変換します。CreateBitmapCopyメソッドは、IFrameQueueBufferオブジェクトを受け取り、それをSystem.Drawing.Bitmapオブジェクトに変換します。
System.Drawing.Bitmapオブジェクトになったところで、各ピクセルの色を反転させる単純な画像処理を行います(ビットマップの各ピクセルを反復処理して、その色のRGB値を255から減算して色合いを反転させています)。
最後に、処理されたビットマップをファイルに保存します。ここでは、output.bmpというファイル名を使用しています。
画像処理することで下記のように輝度値が反転した画像に変換することができます。
[ライブストップ LiveStop]ボタンをクリックしたときの処理
private void cmdLiveStopFrameSnapSink_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStop();
}
上記はIC Imaging ControlのLiveStopを定義したものです。cmdLiveStopFrameSnapSink_Clickメソッドは、[ライブストップ LiveStop]ボタンがクリックされたときに呼び出されます。LiveStopメソッドは、カメラからのライブストリーミングを停止します。
フレームカウントやフレームレートを記載する処理
画面右上にあるカメラから送られてくるフレーム数のカウントアップやフレーム落ちのカウントはDriverFrameDropInformationのプロパティを使っています。詳細については別のサンプルページにて解説を行っておりますので下記を参照ください。