この記事で扱っていること
- 撮影中にマッチングするパターンを切り替える方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWで画像を扱うためのアドオンソフトウェアであるVision Acquisition SoftwareおよびVision Development Moduleを使用することで、画像を撮影中に何か特定の対象を「パターン」として登録、その位置や数を特定するということができます。
画像を撮影するのにVision Acquisition Softwareが必要になり、画像を解析してパターンマッチングの機能を持たせるのにVision Development Softwareが必要になります。
パターンマッチングの対象となるパターンはプログラム上ではテンプレートと呼びますが、これをプログラム実行中に任意のタイミングで変えることができ、またテンプレート画像を保存しておくこともできるようにすることで、一度プログラムを止めてからも同じ対象の位置や数を調べることができます。
これを画像撮影のプログラムを動かしながら、実行中にテンプレートの設定やパターンマッチングを行うプログラムを考えてみました。
どんな結果になるか
フロントパネルには、カメラを選択する部分、もしテンプレート画像があるならそれを選択するためにファイルを開くボタン、あるいは撮影中にテンプレートを作成するためのボタン、そのテンプレートを表示するための表示器を設けています。

テンプレートを作成する場合には別ウィンドウが開いてテンプレートとしたい部分をROI(関心領域)としてドラッグ操作で囲むことができます。

テンプレートを設定し終えたら、あとは画像中にその対象に対して赤枠がついて位置を示すことができます。
また、ここで新たに設けたテンプレートはテンプレート保存ボタンを押すことで保存パスに指定したパスに保存することができます。

プログラムの構造
プログラムとしては今回は効率をそこまで追求せず、一つのWhileループで全て表せるようにしました。

個々の機能は全てラッチ動作のフロントパネル上のボタンに対してケースストラクチャを設けていますが、テンプレートを開くボタンとテンプレート設定ボタンはフラグをやりとりして連動するようにして、片方でも動作したらマッチングを行うようにしています。
各ケースストラクチャの中身を紹介します。
まずはテンプレートを開くの部分です。ここではボタンが押されるとIMAQ ReadFile 2の関数によって画像ファイルを読み込みますが、その画像ファイルパスの指定はファイルダイアログのExpress VIを使用しました。

次にパターン設定のボタンが押された場合のケースストラクチャです。
ボタンが押された、つまりケースがTRUEのときにはIMAQ ConstructROIの関数をまず使用します。この関数は実行されると別のウィンドウが開き、パターンマッチングのテンプレートとしたい対象をROIとして囲むことができるようになります。
もしここでキャンセルが押された場合にはテンプレートは設定されていないことになるため、あとでテンプレートマッチングの動作を行うか判断するケースストラクチャにFALSEを渡します。
テンプレートが決まったら、その指定した領域をIMAQ Extract 2の関数で抜き出し、IMAQ Learn Color Patternの関数でテンプレートとして学習させます。そして、テンプレートマッチングを行うケースにフラグを立てるためTRUEを渡します。
この辺りの作りは、NIサンプルファインダにあるパターンマッチングのサンプルをほぼ流用しました。

テンプレートマッチングを行うケースストラクチャでは、IMAQ Match Color Patternの関数を使用することでパターンマッチングを行い、そのマッチング情報を出力します。このマッチング情報の中にBounding Boxという情報があり、これは特定した対象を囲む4点の座標の情報が入っているため、IMAQ Overlay Multiple Lines 2の関数を使用することでその対象を取り囲むことができるようにしています。

なお、今回の記事のプログラムでは、パターンの学習およびパターンマッチングについての細かいパラメタは特に設定していません。これらを設定するための関数もあるので、もしパターンマッチングの処理の調整が必要な場合にはこれらの関数を使用する必要があります。

最後のケースは、テンプレート保存ボタンが押された場合に実行するもので、IMAQ Write Image And Vision Info File 2という関数によりテンプレートを指定します。この関数でテンプレートを保存することができるのですが、仕様上pngファイルである必要があります。

グレースケール画像の場合
今回紹介したプログラムは、対象をカラー画像としていました。
パターンマッチングの関数はカラー画像かあるいはグレースケール画像かで使用する関数が異なります。
もしグレースケール画像にする場合には、学習も、そしてマッチングも、グレースケール専用の関数に置き換える必要があります。

サブVIにするときに注意すること
このプログラム、中身がごちゃごちゃしているのでサブVIにしてすっきりさせたい、という場合に一か所だけ注意する部分があります。それは、ビジー設定およびビジー設定解除の関数が使用されている部分のサブVI化です。
この関数が入った部分をサブVIにしてかつそのサブVIのフロントパネル操作を行わない場合、ビジーカーソル設定がうまくかかりません。
VIリファレンスの設定を適切に設定する必要があるからです。
そのため、
- メインVIのVIリファレンスをサブVIに渡す
- ビジーカーソル設定の関数自体をなくす
といった対応が必要となります。

パターンマッチングは画像処理の中でも特定の対象の位置を調べたり数を調べたりできる、他の処理につなげやすい処理となっています。読み込んだ画像ファイルに対するパターンマッチングであればサンプルファインダに既にありますが、動的に画像を取得している中でパターンマッチングを実装したい場合に参考にしてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント