「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
2007年中頃、「HALCON」という画像処理ツールを利用した部品検査システムを構築したいとお考えのお客様より、ソフト部分の開発のご依頼をソフテックにいただき、私はその担当者に選出されました。
ところが、ソフテックでは今まで「HALCON」を本格的に使いこなしたことは無く、それに関するノウハウがほとんど無い状況でした。そこで、まずは研究開発という位置付けでの学習から始め、画像処理技術を身に付けてから、お客様にご依頼いただいたソフトの開発に着手しました。(※1)
ここでは、その開発を通して学んだ、画像処理技術や、画像処理アプリケーション作成時の注意点などを、ご紹介いたします。
Windowsアプリケーション内で画像処理を実行するために使用したツールが、「HALCON(ハルコン)」です。開発元はドイツのMVTec社で、ライブラリ関数の組み合わせにより効率的に画像処理システムを開発でき、汎用性にも優れ、世界で高い評価を得ています。
日本国内では、株式会社リンクスが販売を行っています。
以下、多数の機能の中より、私が実際に使用した事のあるものの一部をご紹介します。
基本的な処理で、1つ1つの画素を「明」と「暗」のどちらかに変換します。指定した値(しきい値)よりもその画素の輝度が高ければ「明」、低ければ「暗」となります。(図1)
この方法だと、1画素に収まる長さが精度の限界になってしまうので、輝度の変化率から境界を求め、1画素よりも細かい精度(サブピクセル精度)で2値化を行う方法もあります。
数段階のグレーで表現された画像
左の画像を2値化した画像
図1. 白黒画像の2値化
画像の2値化を行うと、隣り合った「暗」同士の集合ができますが、これを「領域」と呼んでいます。(図2)
また、領域の特性を示すパラメータとして、面積や高さなどがあり、これらのパラメータを「特微量」と呼んでいます。
連続した領域ごとに色分けして表示させた状態
図2. 画像の領域
検査対象を撮影すると、機械の一部やホコリなど、対象外のものが画像内に映り、それも領域として認識されてしまい、アプリケーションはどれが検査対象なのかわからなくなってしまいます。そこで、人間が物を見分ける時にするように、その領域の様々な特徴を分析し、条件と一致する領域だけを取り出す必要があります。
HALCONがあれば、面積、高さ、幅、縦横比、円形性など、その領域の特徴量の解析を、関数をいくつか組み合わせるだけで実行でき、画像内にある検査対象の領域を特定できます。
特徴量の解析により、予めモデルとして登録しておいた領域と似たような領域を、画像内から探し出すという機能が、「パターンマッチング」です。
例えば、複数の金属部品が映っている中から、ボルトを見つける事ができます。複数のボルトの中から、特定の規格のものを見つける事も可能です。
回転角やスケールの変化、一部の欠けなどの許容範囲を設定できるので、様々な画像に対応できます。不良品を検出したり、画像内の検査対象を発見したりするのに使えます。
工場の生産ラインに組み込まれる場合をはじめ、画像処理には、正確さや精度だけでなく、速度も求められる事が多くあります。
速度を向上させるために有効なのが検査範囲の絞り込みで、効果は行う処理内容や対象の画像によって異なってきますが、処理時間をある程度まで短縮できます。例として、画像の5分の1程を占めている金属部品の検査を行う場合に、常に画像全体に対して処理を行うと約100msになる処理時間を、部品周辺に検査範囲を絞り込む事で、30msに短縮できた事がありました。
カメラによる撮影では、照明の不均等、レンズによる歪み、カメラの傾きなどにより、期待する画像を正確に得られない場合があります。
それらは大抵、HALCONが具備しているライブラリ関数による処理を2、3行追加する事で補正でき、理想に近い状態の画像に変換してから検査を行う事ができます。
画像の回転、移動、拡大・縮小、文字の表示、図形の描画などの機能も備えており、操作画面、結果表示画面の編集に役立ちます。
金属部品検査システムの構成例を示します。(図3)
図3. システム構成例
製造機械側から任意のタイミングでシャッタートリガを出力すると、カメラでその画像を撮影して取り込み、アプリケーションが画像処理により長さなどを計測する、という例です。
製造機械からシャッタートリガを出してもらう、というシンプルで確実に同期をとれる方法をとりました。アプリケーションは、画像が撮影され次第、計測からデータ送信までを短時間で行うようにします。これにより、機械側は検査を行いたいタイミングでシャッタートリガを出力するだけで、必要なデータをリアルタイムに得る事ができます。
画像処理による検査は、対象や環境の変化の影響を受けやすく、精密な検査には各パラメータの調整が不可欠になります。例えば検査を行っている部屋が明るくなった場合、検査対象も明るく映り、2値化の境界がずれ、実際と異なる位置を輪郭として認識してしまう事があります。常に同じ対象を同じ環境で検査し続けるのがベターですが、なかなかそうは行かないと思います。
そこで、2値化のしきい値や検査対象の形状などを、アプリケーションの操作画面上で設定できるようにしておき、複数の規格の部品を様々な環境で検査できるようにしました。
2値化によって作成した領域を利用するというのは、ほとんどのケースで共通ですが、対象によって領域の処理方法は大きく異なってきます。やはり複雑な形状の部品ほど、検査プログラムも複雑になる傾向にあります。それぞれの案件に応じ、より早く正確な検査を行う方法を考案しなければなりません。
単純な長方形の検査対象であれば、その領域の高さと幅がそのまま対象の高さと幅になります。画像は単位が[画素(=pixel)]なので、1画素あたりの長さを計算し、計測結果の単位を[mm]に変換すれば、計測完了です。
精度はカメラとレンズの性能に依存するところが大きいのですが、私は最小分解能0.135μmでの計測を行った事があります。(※2)
画像処理により計測した長さや、それに対する良/不良判定結果などを表示します。テキストだけでなく、検査した画像もアプリケーションの画面に表示させました。
必要であれば撮影した画像の中の対象部分を拡大表示させ、良品と不良品の境界を表す直線を引き、視覚的にわかり易くしたりもできます。(図4)
基本的な処理で、1つ1つの画素を「明」と「暗」のどちらかに変換します。指定した値(しきい値)よりもその画素の輝度が高ければ「明」、低ければ「暗」となります。(図1)
この方法だと、1画素に収まる長さが精度の限界になってしまうので、輝度の変化率から境界を求め、1画素よりも細かい精度(サブピクセル精度)で2値化を行う方法もあります。
先端が2本の線の間にあれば良品と判定
図4. 結果画面イメージ
アプリケーションの性質上、工場で使用される事を考慮し、表示を大きく、操作をシンプルにするよう気を付けました。画像処理の設定などを行う機能があっても、必要な数値はできるだけ初期値で与え、起動さえしてしまえばその後は一切操作しなくても、製造機械と連動して検査を行える、というようにしました。
画像処理と聞くと、大掛かりな作業になりそうなイメージがあり、はじめは不安でしたが、思いの外スムーズに開発を進める事ができました。
完成したプログラムは、お客様にもご満足いただけたようで、お礼のお言葉を頂戴しました。今度はこういう機能も追加したい、というような次回に向けてのご要望も伺う事ができ、開発は成功であったと言えます。
その要因として、HALCONの優秀さが挙げられます。
HALCONを使用したアプリケーションの開発では、ライブラリ関数に必要な引数を入力して実行させる、という1行の命令の組み合わせが主になるので、ソースコードが簡潔なものになり、変更や修正を容易に行えます。不慣れな私でも、思い通りに扱う事ができました。
今回ご紹介した以外にも、複数のカメラを使用した3次元検査、画像内の文字認識、動画(連続した静止画)の処理など様々な機能が、HALCONによって実現可能になります。
今後も、さらなる知識・技術の習得に励み、お客様のご希望通りの画像処理アプリケーションを作成できるようになりたいと、考えています。
(N.N.)
関連ページへのリンク
関連するソフテックだより