静止画保存
概要
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_process2_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_Click(object sender, System.EventArgs e)
{
TIS.Imaging.FrameSnapSink snapSink = icImagingControl1.Sink as TIS.Imaging.FrameSnapSink;
TIS.Imaging.IFrameQueueBuffer frm = snapSink.SnapSingle(TimeSpan.FromSeconds(5));
SaveFileDialog dlg = new SaveFileDialog();
dlg.AddExtension = true;
dlg.DefaultExt = ""bmp"";
dlg.Filter = ""BMP Images (*.bmp)|*.bmp||"";
dlg.OverwritePrompt = true;
if( dlg.ShowDialog() == DialogResult.OK )
{
TIS.Imaging.FrameExtensions.SaveAsBitmap(frm,dlg.FileName);
}
}
"最初に、FrameSnapSinkオブジェクトを作成し、icImagingControl1のSinkプロパティを使用して設定します。次に、SnapSingleメソッドを使用してフレームをキャプチャし、保存するフレームを取得します。SnapSingleメソッドの引数には、タイムアウトを指定することが可能で、上記の例ではTimeSpan.FromSeconds(5)を使用して、5秒以内にフレームが到着しなかった場合には、SnapSingleメソッドがnullを返します。
SnapSingleメソッドがフレームをキャプチャすると、TIS.Imaging.IFrameQueueBufferインターフェースを実装したオブジェクトが返されます。このオブジェクトは、キャプチャされたフレームのバッファとなります。そのバッファをTIS.Imaging.FrameExtensionsクラスのSaveAsBitmapメソッドを使用して、指定されたファイル名で保存します。
なお、指定されたファイルではなく指定したフォルダにシーケンス形式で保存するには下記のサンプルページを参照してください。
[ライブストップ LiveStop]ボタンをクリックしたときの処理
private void cmdLiveStopFrameSnapSink_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStop();
}
上記はIC Imaging ControlのLiveStopを定義したものです。cmdLiveStopFrameSnapSink_Clickメソッドは、[ライブストップ LiveStop]ボタンがクリックされたときに呼び出されます。LiveStopメソッドは、カメラからのライブストリーミングを停止します。
フレームカウントやフレームレートを記載する処理
画面右上にあるカメラから送られてくるフレーム数のカウントアップやフレーム落ちのカウントはDriverFrameDropInformationのプロパティを使っています。詳細については別のサンプルページにて解説を行っておりますので下記を参照ください。