ライブ表示のみ
概要
ICImagingControlを使用してTheImagingSourceのデバイスで取得できる映像を表示するアプリケーションのサンプルプログラムです。FrameNotificationSinkがメインの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_process1_cs_3.5.zip |
サンプルツールの外観
クラスの定義(FrameNotificationSinkを使用するための準備)
class Listener : IFrameNotificationSinkListener
{
public void SinkConnected(FrameType frameType)
{
// sinkに接続したときの処理
}
public void SinkDisconnected()
{
// sinkの接続が終了したときの処理
}
public void FrameReceived(IFrame frame)
{
// フレームを受け取るタイミングの処理(負荷が高い処理は避けるようにしてください)
}
}
このコードは、IFrameNotificationSinkListenerインターフェースを実装するListenerクラスを定義しています。Listenerクラスは、IFrameNotificationSinkListenerインターフェースを実装しており、SinkConnected、SinkDisconnected、および FrameReceivedの3つのメソッドを実装しています。
SinkConnectedメソッドは、IFrameNotificationSinkListenerインターフェースで定義されており、フレームの受信を開始するときに呼び出されます。
SinkDisconnectedメソッドは、フレームの受信を終了するときに呼び出されます。
FrameReceivedメソッドは、フレームを受信するときに呼び出され、フレームを処理するためにコールバック関数として画像処理などを実装することができます。ただ、このSink内にはバッファリングしないため、FrameReceived内の処理は素早く完了させる必要があります。システム負荷が高い場合やフレーム間隔に比べて関数内の処理が完了しない場合、フレーム毎にコールバックが呼び出される保障はありませんので注意が必要です。
このように、Listenerクラスは、フレームを受信するためのインターフェースを実装することで、フレームの受信を開始し、受信したフレームを処理するためのメソッドを提供することができます。
フォームを立ち上げたときのイベント
private void Form1_Load(object sender, EventArgs e)
{
// ディスプレイのサイズを調整
icImagingControl1.LiveDisplayDefault = false;
icImagingControl1.LiveDisplaySize = icImagingControl1.Size;
var listener = new Listener();
var sink = new TIS.Imaging.FrameNotificationSink(listener);
icImagingControl1.Sink = sink;
}
まず、ICImagingControlのコントロールパネルのサイズを合わせるためにLiveDisplayDefaultプロパティでfalseに設定しています。
次に、Listenerクラスと FrameNotificationSink オブジェクトを作成します。Listenerクラスは、フレームがキャプチャされたときに呼び出されるメソッド(コールバック関数)を実装します。FrameNotificationSink オブジェクトは、フレームがキャプチャされたときに前述のListenerクラスのメソッドを呼び出すために使用されます。最後に、icImagingControl1オブジェクトの Sink プロパティに、FrameNotificationSink クラスのインスタンスを設定します。これにより、FrameNotificationSinkクラスによって提供されるフレームの通知機能をicImagingControl1オブジェクトに紐づけることができます。
[デバイス選択 ShowDeviceSettingsDialog]ボタンをクリックしたときの処理
private void cmdSelectDevice_Click(object sender, EventArgs e)
{
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(FrameNotificationSink)]ボタンをクリックしたときの処理
private void cmdLiveStartFrameNotificationSink_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStart();
}
上記はIC Imaging ControlのLiveStartを定義したものです。cmdLiveStartFrameNotificationSink_Clickメソッドは、[ライブスタート LiveStart(FrameNotificationSink)]ボタンがクリックされたときに呼び出されます。LiveStartメソッドは、カメラからのライブストリーミングを開始します。ライブストリーミングが開始されたかどうかは、画面右上部にあるカウンターがカウントアップしていることで確認できます。なお、LiveDisplay = falseの場合には画面上に映像が映りませんが、カメラからは画像フレームをPCに出力するという動作を開始しています。
[ライブストップ LiveStop]ボタンをクリックしたときの処理
private void cmdLiveStopFrameNotificationSink_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStop();
}
上記はIC Imaging ControlのLiveStopを定義したものです。cmdLiveStopFrameNotificationSink_Clickメソッドは、【ライブストップ LiveStop】ボタンがクリックされたときに呼び出されます。LiveStopメソッドは、カメラからのライブストリーミングを停止します。
フレームカウントやフレームレートを記載する処理
画面右上にあるカメラから送られてくるフレーム数のカウントアップやフレーム落ちのカウントはDriverFrameDropInformationのプロパティを使っています。詳細については別のサンプルページにて解説を行っておりますので下記を参照ください。