アドオンを使用せずにカメラ撮影する

その他

スポンサーリンク

この記事では、LabVIEWで有償アドオンを使用せずにカメラを使って画像を撮影する方法を紹介しています。

はじめに断っておきますが、全てのカメラに対し同じように動作することを確認しているわけではありません。

また、カメラに対する細かい操作指示や実行の早さ等についてはやはり有償アドオンを使用する方が便利だと思います。

ただ、LabVIEWで画像撮影をして撮影した画像を解析するといった一連の流れを試してみたい、という場合にいきなり有償アドオンを使用するのが不安な場合に、お試しでプログラムを組む手助けにはなるかと思います。

スポンサーリンク

LabVIEWで画像を撮影する方法

LabVIEWで画像を撮影する場合、当然撮影用のカメラを操作することになりますが、通常はVision Acquisition Softwareという有償アドオンを使用することになります。

このアドオンに付属するIMAQドライバ、IMAQdxドライバによってカメラを制御し、画像を撮影、保存することができます。

また、プログラムの中で画像のデータは専用のデータ型、というかリファレンスで扱われます。

取得した画像に対し、いわゆるマシンビジョンと呼ばれる、パターンマッチングなどの画像処理を行うのには、これまた別途Vision Development Moduleというアドオンを使用するのが一番楽です。

画像撮影も、画像処理も、どちらも正式な関数で実装するには有償ライセンスを用意することになるわけですが、画像処理を行う場合のVision Development ModuleにはVision Acquisition Softwareが1ライセンスだけ付属しているとのことで、画像処理も含めた総合的な画像操作アプリケーションを作成するのにはVision Development Moduleを使用できます。

NI Vision Softwareのライセンス提供
この記事では、Vision Development Module、Vision Acquisition Software、Vision Builder for Automated InspectionなどのNI Vision製品を使用してア...

とはいえ、これらのソフトをいきなり使用するのも、購入したもののうまくプログラムが組めるか不安、というものかと思います。

そんなときに、本記事で紹介する方法を使うと、特に有償アドオンを使用しないでカメラによる撮影が行えるようになります。

ただし、全てのカメラで同じように動作するかは確認していません。

実際、私が試した範囲でも、思った動作をしてくれるものとそうでないもの(何度か撮影実行して撮影ができる時やできない時がある)がありました。

また、今回の記事で紹介するプログラムと有償アドオンを使用して作るプログラムは別の形となります(画像をリファレンスで扱わない)。

とはいえ、プログラムの書き方の流れは何となく似ていますし、記事後半では、無償有償それぞれのプログラムのおおよその書き換えプログラムの例を紹介していきます。

無償であれば失敗しても気楽で試す価値はあるかと思うので、LabVIEWでより幅広いアプリケーションづくりに気軽にチャレンジできるきっかけになるかなと思います。

用意するもの

では、Vision Acquisition Softwareを使用しないでLabVIEWで画像撮影をするのに必要なものは何か、ですが、本記事で扱う方法にはPythonを使います。

これを聞いてすぐに察せる方がいるかもしれませんが、今回これから紹介するのはオープンソースであるOpenCVでPythonを介してカメラ操作を行う、ということになります。

そんなプログラム作れるのか不安、という方もいるかもしれませんが、既にGitHub上で公開されているものを使用するだけです。

GitHub - barrowsb/labview_opencv: A LabVIEW 2019 implementation of the OpenCV package using the Python Node
A LabVIEW 2019 implementation of the OpenCV package using the Python Node - barrowsb/labview_opencv

Codeを一括でダウンロードし、これを使用していきます。

この方法はPythonコードをPythonノードというLabVIEWの関数で呼び出す方法になっています。

このPythonノードを使用するには、PCにPythonがインストールされている必要があります。

Pythonには32 bit版と64 bit版がありますが、LabVIEWもPythonと同じビット数のものを使用する必要があります。

Pythonのダウンロードの仕方は本記事では説明しませんが、Pythonの公式ページからダウロードできるインストーラについては3.9.0のバージョン以降ではデフォルトでは64bit版が手に入るようです。

また、各LabVIEWのバージョンで扱えるPythonのバージョンが異なります。

LabVIEWのリリースノートなどで使用できるバージョンを確認しておいてください(例えばLabVIEW 2021では3.6と3.9をサポートしていますが、LabVIEW 2025では3.9、3.10、3.11、3.12がサポートされているようです)。

APIを使ってみる

GitHubのページからダウンロードしたAPIを使っていくつかの簡単なプログラムを書いてみます。

撮影を一度だけ行う

最もベーシックなプログラムになります。

3つの関数を使用するだけで実装できます。

注意点として、最初の関数でPythonのバージョンを指定する必要があり、GitHubからダウンロードしたままのプログラムだと3.7になっているため、PCにインストールされているPythonバージョンと異なる場合にはこれを変更する必要があります。

私が試した経験上、一番最初の実行はやたら時間がかかり(特に初期化)、なおかつ画像取得がうまくいかないことがありました。

しかし2回目以降の実行では、時間がかかることは変わりません(かかる時間は少し短くなるかもしれないですが)が、画像はうまく取れる、という場合もありました。

なお、上に書いたプログラムのInitSessionCV.viには以下の図のようにcameraという名前の数値制御器を付け加えています。

これにより、使用するカメラはPCに複数のカメラが接続されていた場合選ぶことができ、どれを選ぶかを選択させたうえで撮影するといったプログラムに修正もできます。

GitHubからダウンロードしたものの中にはカメラの一覧を取得する機能を含む関数はないのでこれは自分で作ります。

この機能を使用するためにpygrabberをインストールしておく必要があります。

適宜インストールしてpythonスクリプトでインポートしておきます。

使用できるカメラ名の一覧を取得するためのSearchCamera.viの中身は以下のようにしています。

SearchCamera.viで呼び出すget_camera_nameという関数をpythonスクリプトに定義する必要があるので、下図を参考にしてみてください。

ボタンを押すたびに撮影を行う

ボタンを押したら一度スナップショット撮影を行うのは、ケースストラクチャを使用すれば簡単に実現できますが、イベントストラクチャで書くこともできます。

プログラムの形は以下のようにしました。

(疑似的に)連続撮影を行う

連続撮影は、延々とスナップショットを繰り返すことで疑似的に行えます。

Grabはラッチ動作ではなくスイッチ動作としています。

一度セッションを開始してしまえば、連続的に画像を取得するのはそこまで時間がかかる処理ではなく、比較的なめらかに連続した画像を表示させることができました。

撮影した画像を保存する

画像の保存にはLabVIEWの標準関数を使用するのが便利です。

グラフィック&サウンドの関数パレットに必要な関数があるのでこれを使用すればpngやbmp、jpeg形式で保存することができます。

SnapImg.viからの出力はそのまま画像データとして例えばWrite JPEG File.viに渡して保存させることができます。

画像をフリップする

画像のフリップ(左右あるいは上下の反転処理)も用意された関数でサクッと実現できます。

各ボタンが押された状態で反転させるために、ケースストラクチャで切り替える形で実装しました。

Stop以外のブールはスイッチ動作としています。

線画風の撮影を行う

線画風の画像を撮影することもできます。

仕組みとしては、撮影された画像自体はこれまで通りで、プログラム的に線画風に(エッジ検出をして)加工していきます。

顔認識をさせる

顔認識をさせることもできます。

ただ、私が試したときには、GitHubで入手したコードをそのまま使用するだけではうまく顔認識をしてくれませんでした。

そのため、pythonのスクリプトを一部編集しました。

これで顔認識ができるようになりました。

認識された部分を枠で囲って画像上に表示させるためには以下のような関数を用いて枠を用意する必要があります。

画像処理について

ここまでで、基本的な画像撮影のプログラムについて紹介しました。

実際、撮影にかかる早さを考えなくてもいいような場合であれば、画像を単に撮影するだけで事足りる、という方もいるのではないかなと思います。

ただ、せっかくならこれらの画像に対して何らかの処理(いわゆるマシンビジョン)を行いたいと思うわけで、それに必要なのが画像処理に関する一連の処理です。

冒頭でも書いた通り、画像処理、画像解析にはVision Development Moduleというアドオンがありますが、結局は画像というピクセル値の集まりに対して演算を施す程度の処理であれば、頑張れば自力で書くことができます。

私のブログでもこれまでいくつかの「頑張って処理する」ための記事を書いてきました。

「標準関数だけで」というタイトルで過去にいくつか書いているので参考にしてみてください。

画像
「画像」の記事一覧です。

アドオンを使用したプログラムに移る場合

OpenCVを使用したプログラムでも画像撮影ができ、さらに画像解析ができるようになったら、実用に向けて少しは自信をもって動き始められる、という状態かなと思います。

もし、比較的静的な、つまり、実行速度にそこまで気を使わないようなプログラムが必要ということであれば、これまでの内容で十分かもしれません。

ただ、中にはパフォーマンス、プログラムの実行速度をより高めたい、ということもあろうかと思います。

そんな、実際のアプリケーションとして使用する上では実行速度も大切という場合には、やはり有償アドオンを使用するのがいいですし、プログラムを作るのも簡単になります。

冒頭に書きましたが、これまで書いてきた無償の方法と、有償アドオンを使用した場合だと、当然使用する関数が異なります。

そこで、そんな「乗り換え」を検討している方に向けて、OpenCVを使用した場合のプログラムと有償アドオンであるVision Acquisition Softwareを使用した場合とで同じ動作をするプログラムを紹介します。

これを見れば、アドオンを使用する方法に少しはスムーズに乗り換えられるかなと思います。

撮影を一度だけ行う場合

撮影を一度だけ行うプログラムは、有償アドオンを使用して以下のように書けます。

アドオンを使用した方法では画像を直接扱わない(リファレンスで扱う)ため、プログラムの最後にそのリファレンス(画像のメモリ領域)を破棄しますが、画像を表示するための専用の表示器はスタイルによってはデフォルトの設定が「Snapshot」になっておらず、プログラム上でリファレンスを破棄した時点で画像が消えてしまいます。

これを防ぐため、画像表示器を右クリックしてSnapshotを選択しておくと、画像表示器は最後に表示した画像をプログラム終了後でも表示し続けるように設定できます。

ボタンを押すたびに撮影を行う場合

ボタンを押すたびに撮影を行う場合には、SnapではなくGrabを呼び出すことで対応します。

なお、このイベントストラクチャを無くせば、連続撮影を行うことができます。

撮影した画像を保存する

撮影した画像の保存には専用の関数があります。

保存形式はいくつかの選択肢から選ぶことになります。

そのため、Save Pathとして保存先パスを指定したらその指定のファイル拡張子をプログラム的に読み取ってその種類に応じてケースストラクチャでそれぞれの保存形式を指定した状態で関数を使えば便利です。

画像をフリップする

画像のフリップ用の関数があるのでこれをそのまま使用できます。

線画風の撮影を行う

これは、有償アドオンとしてVision Acquisition SoftwareだけでなくVision Development Moduleを使用することで対応できます。

顔認識をさせる

この機能は実はVision Acquisition SoftwareにもVision Development Moduleにもありません。

ただ、VIパッケージマネージャから入手できる、IMAQデータに対応したOpenCVに関するアドオン(これは無償)を使用することで、顔認識をさせる処理を実装することができます。

サンプルを参考にプログラムを組むだけです。

有償アドオンは他にも様々な処理が実行できます。

他にどのような処理があるかについては、Vision Development Moduleに付属するVision Assistantというソフトウェアのサンプルを紹介した記事があるのでこちらが参考になるかなと思います。

本記事ではアドオンを使用せずにカメラ撮影を行う方法を紹介しました。

有償アドオンの方が機能が充実し使いやすいという面はありますが、まずはお試しででもプログラムを作ってみて、いけそうならアドオンを使用する方法に乗り換える、というアプローチの方が安心して導入しやすいのかなと思います。

画像撮影、画像処理にLabVIEWでチャレンジしたい、という方の参考になればうれしいです。

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

コメント

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