この記事では、LabVIEWのアドオンソフトウェアの一つであるVision Development Moduleに付属する、画像解析用のソフトウェアVision Assistantの使用例を紹介したソリューションウィザードを解説しています。
Vision Development Moduleは有償のアドオンソフトウェアなので、どういったことができるかわからない状態で導入したくない、という方にも参考にしていただけると思いますし、既に使用している方には実装したい解析のヒントになるかもしれません。
なお、パート1は以下の記事を確認してみてください。
Vision AssistantとLabVIEWを組み合わせる
本題のサンプル紹介に入る前に、Vision AssistantとLabVIEWの連携について紹介します。
Vision Assistantは画像解析を行う上でとても便利なソフトで、画像に対して処理内容を選択して、パラメタを調整するとその結果をすぐに確認することができます。処理内容もあらかじめそろっているリストから選ぶだけなので、何か特別な「書き方」を覚えるといったこともありません(個々の処理内容に関する設定は一部覚える部分がありますが)。
ただ、Vision Assistantそのものは、画像処理の「準備」をするためのソフトのような位置づけで、これをそのままEXEの形に変換して使用することはできません。EXEファイルとして画像解析のアプリケーションにしたい、という場合にはLabVIEWと組み合わせる必要があります。
Vision AssistantとLabVIEWを組み合わせるには主に以下の二つの方法があります。
- Vision AssistantからLabVIEWコードを生成する
- LabVIEWの中でExpress VIとしてVision Assistantを使用する
以下、簡単に流れを紹介します。
Vision AssistantからLabVIEWコードを生成する
まずはVision AssistantからLabVIEWコードを生成する方法です。
こちらは、LabVIEWのコードを各Visionに関する関数を用いて自動的に生成する機能になっていて、生成されたプログラムを流用(一部改変することもありますが)して自分のプログラムに組み込む際に適しています。
そもそも画像解析については、様々な処理を行うためにの関数の種類がかなり多いです。
LabVIEWの関数パレットを見ればわかると思いますが、Visionの関数は種類が豊富で、特定の組み合わせで使用するといった使い方の作法がある処理もあることから、使いこなすのがなかなか難しいです。
なので、一から全ての解析用の関数を並べて書くというよりは、Vision Assistantで必要な処理をあらかじめ構成しておいてからこれをLabVIEWの中で使用できるように変換する方が便利です。
Vision Assistant内で、行いたい画像処理の一連の流れ(シーケンス)を作り終えたら、以下の図のようにツールのメニューから変換を行います。
Vision AssistantからLabVIEWコードを生成したものは、基本的にVision Assistant上で動作していたのと同じように動くようなプログラムとして生成されているので、各処理に使用する関数もそのままの組み合わせで使えば動く、という状態になっています。
ただし、自動生成の機能が汎用性を持たせて作られているせいか、プログラム実行時の効率に関しては必ずしも最適になっていないことが多いと感じます。
なので、生成されたコードを見て、もっと簡易にできるなどといった判断を下せるくらいの慣れがあった方が効率のいいプログラムにできます。
LabVIEWの中でExpress VIとしてVision Assistantを使用する
効率は特に気にしない、上記の方法で生成したプログラムのように関数がたくさん並んでいる状態でどう修正したらいいかわからない、そんな場合には思い切って処理全体はブラックボックス化して、必要なパラメタだけ与えて結果を出すという使い方も考えられます。
それがExpress VIとしてのVision Assistantを使用する方法です。
これはいたってシンプルでLabVIEWの関数パレットにあるVision AssistantのExpress VIを用意するだけです。
Express VIをブロックダイアグラムに配置すると、Vision Assistantが開きます。厳密には、LabVIEWから独立した単体のVision Assistantソフトウェアとは異なる部分もありますが、処理を組み合わせて構成していく部分は全く同じ操作で使えます。
本記事で紹介しているようなサンプル(ソリューションウィザード)ももちろん確認することができます。
ここで画像処理のシーケンスを作り終えたら、これをそのままExpress VIとしてブロックダイアグラム上に置いてあとは画像処理以外に必要な残りの処理をブロックダイアグラムに作って完成させます。
なお、Express VIとして開いたVision Assistantで処理を作り上げたら、これをExpress VIとしてLabVIEWの中で使用するための入出力の設定も忘れずにやっておきます。
難しいことを考えたくない、LabVIEWに慣れていない、そんな方はこちらの方がストレスがないと思います。
なお、後からやっぱり中の処理の一部だけ抽出したいということであれば、Express VIを右クリックしてフロントパネルを開くことで中身のコード(ブロックダイアグラム)を開くことができます(こうした場合元に戻せなくなるので注意してください)。
ソリューションウィザードの各処理について
では、パート1に引き続き、Vision Assistantのソリューションウィザードの処理内容について紹介します。
ボードン圧力管キャリブレーション
ボードン圧力管キャリブレーションでは、対象物の中のある形状から別の形状までの距離を測るような検査をしています。
形状同士はパターンマッチングで探し出し、パターンマッチングの中心点同士の距離はキャリパ処理で測定しています。
缶検査
缶検査では、輪郭解析によって対象物である缶のへこみを検出します。
この場合の輪郭解析には円が指定されていて、へこみ具合を数値化しています。
クッキー検査
クッキー検査ではエッジを検出して各検査対象のクッキーの画像の原点を設定し、テンプレートの画像と比較することで欠陥を見つけるという処理を行っています。
例えば以下の対象の図では右端や下端に欠陥が見えていますが、これらが「テンプレートと比べたときに差が大きい」とみなせます。
対象(クッキー)が画像の中央に常にあるとは限らずある程度位置がずれることも考慮するために、座標系を設定します。新規の座標系を設定し、その座標系に対する相対位置としてクッキーの外観の検査を行うという想定をしています。
そのために、まずは左端と下端を取得するために広く関心領域(検索対象の領域。ROI)を取って上級エッジ検出を行っています。
左端、下端がわかったら、その直線エッジ(クッキーは凸凹していますが、凸凹の山の部分から求められる直線同士)の交点を新規の座標原点として定めます。
あとは左、上、右、下それぞれに対してテンプレートとの比較を行わせるためのROIを、新規でとった座標系からの相対位置として設定するようにしています。
こうすることで、クッキーの位置がずれても毎回新規座標系からの相対位置としてROIが設置されるので正しい位置で検査を行うことができます。
ラベル検査
ラベル検査では対象としている画像がテンプレートとどれだけ異なるかをハイライトして表示します。
これにより、「テンプレートにはあって対象とする画像にはない」、あるいはその逆で「テンプレートにはなくて対象とする画像にはある」部分を区別することができます。
黄金テンプレートとの比較は位置関係が大事なので、まずは画像内のどこに対象があるのかを調べますが、これには通常のテンプレートマッチングを用います。
あとはマッチングした位置を中心に黄金テンプレートと比較し、ラベルの位置のずれや欠けなどがあるかを調べます。
テンプレートにあって検査対象にない領域、またはその逆、をそれぞれ別の色でハイライトできます。
LEGOブロック検査
LEGOブロックの検査では、対象画像にうつっている部品が何色のどんなパーツなのかを判断し表示します。
Vision Assistantの処理の中に、色と部品の名前を判断する機能はありません。これにはLabVIEW VIを用います。
つまり、Vision AssistantからLabVIEW VIを呼び出して、その結果をVision Assistantに返しています。
このプログラムにより、以下のような分類を行って画像上に表示させることができます。
色鉛筆検査
色鉛筆検査ではカラーパターンマッチングを使用して目的の色になっているかを確認したりパターンマッチングを使用することで鉛筆の先端が折れていないかを確認しています。
カラーマッチングによって、まずは想定した色の鉛筆であるかを検査します。
その後カラープレーンを抽出してグレースケール画像とし、あとはパターンマッチングを行って先端が存在しているかを確認します。もしマッチングしなければ、それは先端が欠けた色鉛筆だと判断しています。
リモートコントローラ検査
この検査では、コントローラ表面にある、一定の模様(テクスチャ)に対し欠陥があるかどうかを判別しています。
このサンプルでも画像の中の検査対象の位置を調べるためにまずはテンプレートマッチングを行い、その後マッチングした情報を元に新規の座標系を定義しています。
座標系を元に、調べたいテクスチャを指定して、そのテクスチャ上に欠陥がないかを確認しています。
木材検査
木材検査では二値化を利用して木材表面の欠陥を調べています。
欠陥の有無は背景と明らかに異なる領域を調べる事で判断しますが、背景との分離には二値化を行います。
そのためにまずは欠陥部分をより際立たせるための処理の一つであるルックアップテーブルを使用して、その後二値化処理を施しています。
あとは実際に調べたい欠陥部分とは関係のない、「ノイズ」部分を削除したり、画面端に見切れた領域も邪魔なので削除して本当の欠陥のみを抽出するようにしています。
本記事ではVision Assistantのサンプルであるソリューションウィザードの中身について紹介してきました。
似たような操作をしているものどうしもいくつかありますが、対象とする画像は全然違ったりします。なので、画像が異なってもいくつかの手法を覚えておけば様々に応用が可能であると言えます。よく使う処理についてはソリューションウィザードや各処理のヘルプの内容を確認しつつ使っていけば徐々に慣れていけると思います。
ソリューションウィザードのサンプルはもう少しあるので、次回の記事で残り全てのサンプルを紹介していきます。
ここまで読んでいただきありがとうございました。
コメント