トップページへ戻る

■WEBカメラとVisual Basic 画像検査プログラム その4(機能付加編)

大筋はこのような具合に完成 したわけですが、判定基準をゆるくしたりキツクしたりもしたいし、NGビットの描画色も検体に応じて見やすい色に変更したいものです。 また判定の目安としてNGビットの数もわかると良いですね。 完成したのがコレです!!

画像検査ソフト

NG色の変更するときはこんな感じでカラーダイアログが出現します。

NG色の選択

検査レベル

検査レベルはAbit−(マイナス)Bbitの絶対値で判定してます。 0〜255の数値で設定するのですが、ここで設定した数値をNGcontという変数に代入して、 |A−B| と比較してOKかNGかの判定をしています。 通常使用の場合は光線の加減がかなり影響するので、30〜40程度での測定になりそうです。

NG色の選択

カラーダイアログから色指定するようにしました。カラーダイアログを使うこと自体は難しいことではないのですが、 CommonDialogColorに格納されたRGB(R,G,B)の色を抽出するのに苦労しました。 これは例えば赤が選ばれた場合は255という数値が入ります。緑が選択された場合は65280になります。 255で割った余りを使う方法でまる1日悩み、ネットでまる1日検索しまくり、結局使えそうなものが見つかりませんでした。 結局下の4行のプログラムで解決したのですが、まる3日かかってしまいました。
@桁がズレするのを防ぐために&H1000000とor計算を行い文字列としてComDLC$に格納します。 これで&hFFだった赤が&h10000FFになります。緑は&h100FF00です。
Aあとは文字列から必要な箇所を抜き出して再び数値に戻してあげればOKです。
B現在の選択色がわかるようにラベルを貼り付けて背景色として描画しています。

ComDLC$ = Hex(("&h" & Hex(CommonDialogColor)) Or &H1000000)
R1 = Val("&h" & Right(ComDLC$, 2))
G1 = Val("&h" & Mid(ComDLC$, 4, 2))
B1 = Val("&h" & Mid(ComDLC$, 2, 2))

NGカウント

NGビットの数と%がわかるようにしました。これはNGfrgという変数を用意して、 NG判定したら+1していけばいいだけなので簡単でした。 最後にその数を表示して、計算した%の値を表示しています。

判定画像内のカーソル位置の色情報取得

おまけ機能なんですが、このプログラムの一部を利用して色差計を作成するかもしれないので、 カーソル位置の色情報を取得し表示しました。スクリーンキャプチャするとマウスカーソルが消えてしまうみたいですね。 カーソルは比較画像のオレンジ色の丸の中にあります。

マウスカーソル位置の色情報の取得

あとはWEBカメラの手前に置くレンズの選択と作業台の作成です。ここまでくればなんとかなりそうな予感です...??


つづき
完成したソフトでは320×240のビットマップ画像の比較を行うことができます。 レンズを組み合わせてかなり細かい文字の画線の不具合まで検知できそうな感じなのですが、 人間、完成すると欲が出てくるもので、もうちょっと解像度が上がらないもんかと思っていました。
そして完成した640×480バージョンがコレ!  「プレビュー拡大」、「基準画像拡大」、「判定画像拡大」という3つのボタンを付けて、 さらに画面いっぱいに大きく表示できるようにしました。

検査ソフト 640×480バージョン

640×480の画像3枚をそのまま表示するために、画面の解像度は1280×1024に上げています。
検査結果のNG判定が多いのは手振れが原因です(笑)  なんとか640×480の画像をWEBカメラから取得できないかといろいろな方法を試した結果、こちらの DirectShow関係3のサイト 様で公開されているDirectShowDefine.vb(DirectShow関係の定義モジュール)を利用したら簡単に実現しました。 VB2005となっていますがVisual Basic 6でも使えました。 画像を取り込みさえすれば、あとは上で完成した320×240バージョンに組み込むだけです。
難点と言えば、モニタの解像度をかなり上げてしまったので通常使用では字が小さくて使えません(汗)  まぁ検査専用パソコンを用意するつもりなのでその辺は問題ないとしても 判定にセレロン2G、メモリ512MBのパソコンで約20秒もかかります。 1ビットに対してRGBそれぞれ別途に比較しているので、約100万回の計算を行っていることになります(たぶん)  高性能なパソコンが必要になりそうです。
約5倍のレンズを組み合わせて、3cm×2cmの検体が画面いっぱいになるように調整すると、 1ビットあたり0.04mmの精度が出ることになります。あくまで計算上ですが...  これから使いながら不具合点を修正して使いやすいソフトにしていこうと思います。
ソースの公開ですが、いましばらくお待ち下さい。かなりぐちゃぐちゃな状態で公開できるレベルではありません。 後で自分がわからなくならないように今以上にコメント文をさらに追記します。
このレベルになると Logicool Qcam でないと使い物になりませんでした。 どのくらいの差があるのか、 WEBカメラの画像比較はこちら でご確認下さい。


機能の追加

現在カメラとレンズをくっつけて検査台を作っているところなのですが、デモを行ってみるとまだまだ不十分なところが出てきました。
@処理が遅い → 検査時間を短縮する。
A動作のひとつひとつの区切りがわかりづらい。 → 音がなるようにする。
BNGビットの色を変えて描画しても見逃しがありそう。 → 判定値を設けて合否を表示する。
で、できたのがコレです↓。 改良した検査ソフト @の動作速度は、NGビットに使用するコモンダイアログカラー指定色をRGBに分解する処理を各ビット比較の判定毎に行っていたのですが、 「検査Gp!」ボタンが押された直後に1回だけ行い、変数に格納するように変更しました。 これにより640×480画像の検査時間を20秒から10秒に短縮しました。(この数字はPCのスペックにかなり依存します)
Aについては、拡大表示の時と検査が終わった時に音を鳴らすようにしました。 APIを使ったので好きなWAVデータを使えます。画像の拡大時はピッと、検査終了時にはチロリン〜と音が鳴り、 ひとつひとつのアクションがわかりやすくなりました。
Bは画像を見てわかると思いますが、検査中は 、 判定OKなら 、NGなら× を表示するようにしました。判定基準はNGビット数がいくつまでならOKかをテキストボックスに入力できるようにしました。
直したついでにRGBのMAXやMINなどの使わない機能を削除しました。 基本的には比較しか行わない予定ですが、足し算、引き算、割り算、掛け算は残しておきました。
あと付け加えるとしたら「簡易検査機能」を考えています。 例えば赤い印刷物を検査する場合、緑と青のビット比較は不要です。 RGBの単色だけの検査ができるようにすれば単純計算で検査時間が1/3になります。
はじめは簡単なプログラムを考えていたのですが、かなり欲張ったソフトになってきました。 画像処理の仕組みもかなり理解できたので、業務用のUSBカメラを使って売れる(?)ソフトを本格的に作成したいな、 とも考えるようになりました。