Visionプログラムの注意ポイント

その他

スポンサーリンク

この記事では、LabVIEWで画像撮影および画像処理を行うためのアドオンソフトウェアであるVision Acquisition Software (VAS)やVision Development Module (VDM)の関数を使用したプログラムを作るときに注意するポイントをまとめてみました。

VASやVDMを使用するプログラムは、考え方を知っていないと意図した結果が得られない場合があります。どういう構造でプログラムを組む必要があるのか、はあまりまとまった資料が見当たらなかったのでそれらを紹介していきます。

スポンサーリンク

IMAQ Createとは

まず、VAS、VDMどちらの関数を使用する場合でもIMAQ Create(およびこれとペアのIMAQ Dispose)は必ず知っておかなければいけない関数です。

この関数は、LabVIEWプログラムの中で画像を扱うために使用するのですが、この関数で生成されるImageというデータタイプは、画像そのものではなく、画像データへのリファレンスであることに注意します。

画像と画像データへのリファレンスの何が違うの?と思われる方も多いと思うので、以下に例を出します。このVIがあるのと同じ階層にescher.bmpという画像ファイルがある状態で実行します。

こちらの例では、IMAQ Createが二つ使われていて、どちらにもEscherという名前がついています。片方はIMAQ Read Fileという関数に渡すことで画像ファイルを読み取りこれを表示していますが、後半のIMAQ Createは単に画像表示器に配線しているだけです。

このプログラムを実行すると、どちらの表示器にも同じ画像が表示されます。Image 2の表示器には単にIMAQ Createを配線しただけなのに、Imageの表示器と同じ結果が出ています。これは、2つのIMAQ Createが同じ名前(Escher)を持つことで、どちらのワイヤも同じ画像データを参照していることを表わしています。

そのため、特別理由がない限りはIMAQ Createの関数には個々に別の名前をつけるようにしてそれぞれで異なる画像データを参照するようにします。

なお、IMAQ DisposeはAll Images?というブール入力があり、デフォルトではFALSEとなっています。このIMAQ Dispose、IMAQ Createで作成した画像リファレンスのメモリを解放するために必要なのですが、多くのIMAQ Createを使用する場合にはAll Images ?にTRUEを配線することでそれまでのすべてのIMAQ Createで用意したメモリを解放できます。

もし特定のIMAQ Createのみ解放する場合にはそのImageワイヤを配線し、All Images?をFALSEとします。

ImageのSourceとDestination

VAS、VDMの関数には、Image SrcとImage Dst入力がある関数がいくつかあります。

これらの関数は使い方に注意が必要で、「処理する前の画像データも必要ならばDstに配線が必須」という観点からImage Dstに配線することを検討します。

Image Srcは必須入力なので配線する必要がありますが、Image Dstは入力必須ではありません。

例えば、IMAQ Thresholdという、画像に対して二値化をかける関数を例にとります。

わざと同じ名前のIMAQ Createを二つ置いて片方はIMQ ReadFile2の関数に、そしてその出力のImage outをIMAQ ThresholdのImage Srcに配線し、もう片方は何も配線せずに表示させます。すると結果は下の図のように、どちらも二値化後の結果が出ます。

今度は、IMAQ ThresholdのImage DstにEscherDstという名前のIMAQ CreateのImageリファレンスを配線してみます、すると、Image表示器の画像は二値化前の結果が出ていることがわかります。

Image Dstは何も配線されていない場合には、Image Srcの画像を上書きしてその処理(今回で言えば二値化)をするのに対し、Image Dstが配線されていることで、処理前の画像はImage Srcに配線したImageリファレンスの方で維持したまま、Image Dstに配線したImageリファレンスに処理後の画像を表示するようになったということになります。

画像表示の順番に気を付ける

上記の内容とも関連しますが、画像表示器への実行タイミングも考慮する必要がある場合があります。例えば、再び二値化するプログラムを例にとります。二値化する前後の様子を知りたい、ということでIMAQ Thresholdの関数の前後に画像表示器をおいています。

では次に、下のようなブロックダイアグラムにわざと書き換えて実行します。すると、IMAQ Thresholdの関数よりも前の状態のワイヤから配線しているはずのImage表示器も二値化後の値が表示されるようになることが分かります。

ここが画像を扱うプログラムを組むときにうまく期待した画像が出ない原因になったりします。LabVIEWのプログラムは明確に実行順番が定まっていない限り、毎回必ず同じ順番で実行される保証がないため、十中八九意図したとおりに動作する場面も多いのですが、確実ではありません。もし「この時点での画像を表示したい」という状態がある場合には、順番付けを行う必要があります。

ただし、画像表示器にはエラーの入出力はないため、基本的にはフラットシーケンスストラクチャを使用して順番を付けることになります。(NIサンプルファインダのサンプルも画像を扱うプログラムでフラットシーケンスストラクチャが使われているプログラムはこれが理由だと思います)

画像が表示されない

もし、上記の内容を実際にプログラムを自分で組んで確かめたいと操作された方はもしかすると画像が上手く表示されないという場面に遭遇するかもしれません。あるあるなのは、二値化画像が表示されないというケースです。

これは、画像表示器の設定に依ります。画像表示器はデフォルト(フロントパネルに表示器をおいただけの状態)では二値化画像を表示させることができません。表示させるには設定をBinaryに変更する必要があります。

また、画像表示器のスタイルによってもデフォルトが異なり、この違いがあることを知らないと表示器毎に異なる結果となることにも注意が必要です。

新規VIを作り、フロントパネルに3種類の画像表示器を配置し、そのすべてに同じ画像データを配線するプログラムを考えたとします。

このプログラムを実行すると、シルバーのスタイルの画像表示器のみ画像が表示されるという結果になります。なぜ画像が表示されるものと表示されないものがあるかというと、画像表示器自体のSnapshotの設定が有効になっているかどうかで違いが出てきます。

なぜか画像表示器のスタイルによってこのSnapshotがデフォルトで有効か無効かが変わっており、この設定によって画像が表示され続けるものとされない(正確にはIMAQ Dispose後に画像が消えてしまう)ものがあります。ただこの設定は右クリックでいくらでも変更可能なので、特定のスタイルの画像表示器がそもそもSnapshotの機能に対応していないというわけではありません。

あくまでIMAQ Dispose後にも画像を表示させておくかどうかの違いにはなるのですが、プログラム終了時には基本的にIMAQ DisposeでIMAQ Createで用意した画像リファレンスを閉じるべきなのでこの仕様を知らないと画像を表示させ続けることができないので注意が必要です。

VAS、VDMの関数の使用にまだ慣れていない時に、あれ、意図した結果が出ないという場面で注意する必要がある項目をいくつか紹介してきました。

LabVIEWで行う画像処理は、Vision Assistantの力も借りられるので、必ずしもすべてを一から組む必要はないのですが、画像表示の仕方などはユーザーがどこに画像表示器を付けてどのタイミングで実行させるかに依るのでぜひこの記事で紹介した内容に注意しながらプログラムを作ってみていただければと思います。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました