ライブ表示とマルチプロセス処理について
概要
ICImagingControlでは様々な処理を同時並列に行うことができます。ここでは、「ライブ表示」をしながら、「画像処理」、「静止画保存」、「動画の保存」を並列に行うサンプルプログラムを紹介します。それぞれの処理は、プログラムから任意のタイミングで処理内容を命令する場合と、リアルタイムに画像処理をしながら行うものに大別されます。また同時に動画も撮影するという事を行う場合のサンプルも用意しています。それぞれICImagingControlのSinkのオブジェクトをメインに使います。処理内容に応じて大別すると以下の通り6種類あります。
処理内容とタイミング | 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の切り替え | 無し | 無し | 無し | 有り | 無し | 無し |
ICImagingControlの具体的なSinkやAPIについて、以下より説明します。
ICImagingControlのsinkについて
ICImagingControlは、DirectShowフィルターグラフを使って、カメラからの送られてくるフレームを取得しています。
DirectShowとは、マイクロソフトが開発したマルチメディアフレームワークの一つで、Windows上で音声・映像の再生やキャプチャなどの処理を行うためのAPIやコンポーネント群を提供しています。DirectShowでは、画像の再生、キャプチャ、エンコード、デコードなどの処理を行うために、異なる機能を持つ複数のフィルターをつなぎ合わせフィルターグラフを構築します。フィルターグラフは、フィルターをつなぎ合わせるパイプラインの構造であり、異なる種類のフィルターを接続することで、様々な動画保存や静止画保存などの処理ができます。ICImagingControlは、DirectShowに基づいて構築されたフィルターグラフをラップしたライブラリであり、開発者がフィルターグラフを簡単に構築できるようにするための多数のAPIを提供しています。
ICImagingControlでは、カメラから送られてくるフレームの取得方法を指定するのにsinkと呼ばれるオブジェクトを使用します。
Sinkのそれぞれの特徴と関連する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の切り替え | 無し | 無し | 無し | 有り | 無し | 無し |
sinkを使うことで画像保存・動画保存・コールバック呼び出すモードを簡単に切り替えることができます。
IC Imaging Controlのsinkは大きく分けて、FrameNotificationSink、FrameSnapSink、MediaStreamSink、FrameQueueSinkの4種類があります。
FrameNotificationSink
カメラから送られてくる画像を取得する簡単なSinkです。ドライバメモリからアプリケーションメモリへのコピーを行いません。このSinkは、アプリケーションが画像データをサードパーティ製の画像処理ライブラリなどのバッファにイメージのコピーが必要な場合に有効に使用できます。このSink内にはバッファリングしないため、コールバック関数内の処理は素早く完了させる必要があります。システム負荷が高い場合やフレーム間隔に比べて関数内の処理が完了しない場合、フレーム毎にコールバックが呼び出される保障はありません。
FrameSnapsink
FrameSnapSinkは、任意のタイミングで撮影するときに使用されます。例えば、ライブ表示はデバイスから取得したまま表示が行えますのでカメラのスナップショットやオブジェクトの識別などのアプリケーションで使用されます。カメラから送られてくる全フレームを取得するにはFrameQueueSinkを使用してください。
MediaStreamSink
MediaStreamSinkはカメラから送られてくるフレームを取得してビデオファイル(AVI、WMV、MPEG4形式)として保存することができます。 録画中のパフォーマンス低下を防ぐには、ICImagingControl.LiveDisplayプロパティをFalseに設定しライブ画像を非表示にすることが推奨されます。
FrameQueueSink
FrameQueueSinkはキャプチャされたフレームをキューに入れ、画像処理などでフレームを必要とするときにキューから取得することができます。