画像撮影中にスナップショット保存 | マーブルルール

画像撮影中にスナップショット保存

Tips

スポンサーリンク

この記事で扱っていること

  • 画像撮影中にスナップショットを保存する方法

を紹介しています。

注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。

画像を撮影中に画像全体あるいは画像の一部(関心領域、ROI)をスナップショットとして画像保存したくなるときがあったのでプログラムを作ってみました。

実装が簡単なのは画像全体について、ある瞬間のスナップショットをとってそれを保存する方法ですが、ROIの画像だけを保存するのもプログラムはそこまで変わりません。(後半で紹介します)

なお、以下のプログラムでは、Vision Acquisition SoftwareとVision Development Moduleの関数を使用しています。これらはLabVIEWのアドオンソフトなので、LabVIEW単体では実現しない機能なのでご注意ください。

スポンサーリンク

どんな結果になるか

画像全体についてスナップショットをとるプログラムのフロントパネルです。

プログラムを実行すると、最初は画像保存ボタンがグレーアウトします。これは、スナップショットを取らないと保存できないようにしているためです。

スナップショットをとってから保存ボタンを押すと、指定した場所、ファイル名で保存できます。

プログラムの構造

以下がブロックダイアグラムです。デザインパターンとしてはステートマシンを採用しました。

本来であればイベントストラクチャを使用してもっと効率のいいプログラムが組めるのかもしれませんが、撮影した画像を取得するGrabの関数はWhileループを回し続けるのでポーリング動作をせざるを得ず、これとステートマシンの要素を組み合わせています。

各ステートは以下の通りです。

まずはgrabステートです。フロントパネル上のボタンが押されなければ、基本的にはこのステートがずっと実行され続けます。ただgrabの関数で画像を取得しているだけです。

次に、snapステートです。このステートで、撮影した画像のスナップショットをとります。

IMAQ Copyの関数を使用して、スナップショットとした画像を別の画像メモリ領域に保存して保持します。また、初めて呼び出されたときにsaveボタンの無効プロパティに対して有効入力を与えることで、フロントパネル上のsaveボタンが押せるようになります。

そして、saveステートです。このステートで、スナップショットを保存します。今回のプログラムではIMAQ Write File2の関数をBMPにしているためbmp形式の画像保存となりますが、この関数の多態性セレクタを変更すればpngやjpgなど他の画像形式で保存することもできます。

なお、各ステートに関係なく毎Whileループで実行する関数にCalculate Frames per Secondという関数がありますが、これはフレームレートを計算するサブVIになっています。

C:\Program Files (x86)\National Instruments\LabVIEW 20XX\vi.lib\vision

のパス(LabVIEW 20XXは使用しているLabVIEWのバージョンを選択)にあるので、これをそのまま使用できます。

ROIの画像のみを保存する場合

では画像全体ではなくROIで指定した部分のみを保存する場合にはどうするか?基本的には組み方は同じで、ここにROIを扱う関数を少し加えることになります。

まずフロントパネルは次のようにしてみました。

実行するとこんな感じで、ROIとして指定した部分のみをスナップショットとして表示させ、保存ボタンが押されたらその部分のみを保存するようにします。

ブロックダイアグラムは画像全体を保存するプログラムと共通している部分が多いですが、以下のようにしてみました。

まずは全体像です。

ステートの数も同じく3つで、まずはgrabステートです。これは全体のスナップショットをとるプログラムと変わりません。

次にsnapステートです。ここでは、IMAQ Copyした画像をIMAQ Extractによって抽出する際にROIの情報を使用しています。画像表示器を右クリックして作成からプロパティノードを選び、ROIプロパティを選択して得られるものを情報として使用しています。

そしてsaveステートです。

これでROIの部分だけを保存するプログラムの完成です。

アドオンが必要とは言え、画像撮影そしてその場での加工を必要とするアプリケーションもLabVIEWであれば他の関数を使用するのと同じような感覚でプログラムを組めます。今回のプログラムは画像領域を二つ用意して、Grab用とSnapshot用の二つの画像を扱うので少しややこしいのですが、ワイヤのラベル付けなど駆使してこんがらがらないように注意する必要があります。

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

コメント

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