社員リレーブログVol.27 LabVIEWとPythonの連携について(&OpenCVでの画像処理)
はじめに
こんにちは。研究開発部のFです。
今回は、LabVIEWとPythonの連携についてご紹介いたします。
※今回は技術ブログ的な内容になっております。
特に、Pythonで画像処理を行うプログラムをLabVIEWから呼び出したいという人に向けた記事です。
Pythonは、シンプルで読み書きしやすい文法と豊富なライブラリを備えたプログラミング言語です。
ライブラリが充実しているため、LabVIEWでの実装が難しかったり、実装に時間がかかったりする機能も、簡単に実装できる可能性があります。
近年では、ChatGPTなどの生成AIがコーディングを支援してくれるため、さらに実装時間を短縮できるかもしれません。
そんなPythonのコードをLabVIEWから呼び出して使用することができます。
今回は、LabVIEWからPythonのコードを呼び出す方法と、OpenCVというPythonの画像処理ライブラリでLabVIEWの画像を処理する方法について紹介したいと思います。
目次
1・前提条件
2・LabVIEWからPythonの呼び出し
3・Python連携でOpenCVを使う
4・Python連携で配列を入出力するときの注意点
5・まとめ
1・前提条件
LabVIEWでPythonの呼び出し機能を使用するには、LabVIEWバージョン2018以降が必要になります。
また、PCにPythonの環境がインストールされている必要があります。
LabVIEWのバージョンによって使用できるPythonの環境が異なりますので、ご注意ください。
例えば、32bit版のLabVIEWから64bit版のPythonを呼び出そうとするとエラーが出て実行できなかったりします。
表 1 LabVIEWとPythonのバージョン(ビット数)の対応
詳細は以下のサイトをご参照ください(National Instruments様のサイトです)。
https://www.ni.com/en/support/documentation/supplemental/18/installing-python-for-calling-python-code.html
2・LabVIEWからPythonの呼び出し
以下にPython呼び出しを行うLabVIEWのブロックダイアグラムの例を示します。
図 1 Python呼び出しのブロックダイアグラム
呼び出しているPythonのコードは下記の通りです(ファイル名:sample_code.py、図1の赤枠内参照)。
上記ブロックダイアグラムの説明をします。
Pythonセッションを開く
・Pythonバージョン:使用したいPythonのバージョンを入力します。
・Pythonパス:Pythonインタプリタの実行ファイルのパスを指定できます。
→この入力は省略可能です。
→デフォルトで呼び出されるPython環境と別のものを使用したいときなどに入力します。
Pythonノード
・モジュールパス:呼び出したい関数が定義されているPythonファイルのパスを入力します。
・関数名:呼び出したい関数の名前を指定します。
・戻り値タイプ:呼び出す関数の戻り値のLabVIEWでのタイプを指定します。
・入力パラメータ:呼び出す関数に渡すデータを入力します。
・戻り値:関数の戻り値が出力されます。
このVIを実行すると、下記のようになります。
図 2 Python呼び出しのVIの結果
はい。ただの足し算です。
ですが、この足し算はLabVIEWではなく、Pythonで処理されたものになります。
今回はただの足し算ですが、Pythonのコード次第では機械学習やAIを活用したデータ処理や、GPUを活用した配列計算など、様々な応用が考えられます。
3・Python連携でOpenCVを使う
次に、LabVIEWのPython連携でOpenCVを使った画像処理の例を紹介いたします。
LabVIEWにはVision Development Moduleというアドオンがあり、これを用いればある程度の画像処理はできるのですが、今回はPython連携の紹介ですので、画像の読み込みにだけ使用します。
LabVIEWでの画像のデータタイプは主に2種類あります。
1つ目は上述したVision Development Moduleで扱うためのIMAQ Image形式です。
2つ目は標準のLabVIEWで画像を扱うためのPixmap(ピックスマップ)という形式です。
Pythonにデータを渡すためには配列形式にする必要があるのですが、IMAQ ImageもPixmapも配列に変換することが可能です。
では、さっそくブロックダイアグラムとPythonコードをお見せします。
※ 下記プログラムを実行するためには、Python環境にOpenCVのインストールが必要となります。
図 3 IMAQ形式の画像をPythonのOpenCVで処理するVIのブロックダイアグラム
図 4 Pixmap形式の画像をPythonのOpenCVで処理するVIのブロックダイアグラム
Pythonのコード(filter.py)
流れを簡単に説明すると、LabVIEWから画像を2次元配列としてPythonに入力し、Python上で3次元配列に変形してOpenCVで処理しています。今回はガウシアンぼかしというフィルタ処理を行っています。処理された画像(3次元配列)は2次元配列に変形してLabVIEWに返しています。
カラー画像の1画素は赤・緑・青の3色(RGB)から成り立っています。
LabVIEWでは1画素分の色情報(RGB)を1つの要素として扱うため、高さ×幅の2次元配列となります。
それに対し、OpenCVではRGBの各色を独立した要素として扱うので、高さ×幅×チャンネルの3次元配列となります(1画素ごとにRGBの3つの値を持つ)。
なので、LabVIEWから入力されたデータをそのままOpenCVで使用できないため、変換処理を行っています。
図 5 LabVIEWとOpenCVの配列形式
それでは、上記のVIの実行結果をお見せします。
左側が元の画像、右側がOpenCVでガウシアンぼかしの処理を行った画像になります。
ちゃんと、ぼかしが入っていることが確認できますね。
図 6 OpenCVでの画像処理結果(左:元画像、右:処理後画像)
ちなみに、Pixmapの場合はLabVIEW 上で2次元配列ではなく、1次元配列として扱うこともできます(※)。この1次元配列はRGBの各色が独立した要素となるため、Pythonコードをシンプルにできます。下記に方法を記載しますが、詳しい説明は割愛します。
※ というよりも、図4のVIはIMAQ形式のものと同じPythonコードを使うために、元々1次元配列
だったものを2次元配列に変換して扱っているので冗長でした。
Pixmapを1次元配列で扱う方法
① Pixmapのクラスタ要素から1次元配列と幅と高さを取り出して、Pythonに入力
② 入力された配列と幅、高さをもとにndarray.reshapeで3次元配列に変形し、OpenCVで処理
③ 処理された画像をndarray.flattenで1次元配列に戻して、LabVIEWに返す
④ 戻り値の1次元配列をPixmapのクラスタに戻す
4・Python連携で配列を入出力するときの注意点
Pythonで配列を扱う際はNumPyというライブラリを使用すると、高速に処理できます。また、NumPyの配列形式を前提としているライブラリも多く存在します。上記で使用したOpenCVも画像をNumPyの配列として処理します。
LabVIEWのPythonノードは入力パラメータに配列がある際、それをNumPy形式にマーシャリング(変換)する機能があります。
Pythonノードの入力パラメータとして配列を接続した状態で、右クリックメニューを表示し、「NumPy配列にマーシャリング」をクリックし、チェックマークが入った状態にします。
図 7 NumPy配列へのマーシャリングの設定方法
OpenCVなど、NumPyの形式で配列を扱うライブラリを使用する場合、NumPy配列にマーシャリングする設定にしておくと、処理時間が速くなることが多いです。
図3のVIを改造して、Pythonノードを10回実行した際の処理時間を計測できるようにします。
このVIを使用して、NumPy配列へのマーシャリングの有無でどのくらい処理時間が変わるか測定してみます(呼び出すPythonコードは先ほどと同じ、filter.pyのgaussian関数になります)。
なお、Pythonに入出力する画像は1200×1200のカラー画像です。
図 8 処理時間計測用VIのブロックダイアグラム
結果は以下のようになりました。
図 9 NumPy配列マーシャリングの有無による処理時間の比較
NumPy配列マーシャリングなしだと2712ミリ秒(1回あたり約271ミリ秒)、マーシャリングありだと589ミリ秒(1回あたり約59ミリ秒)でした。マーシャリングありの場合、なしの場合に比べて4~5倍ほど速くなっています。
なので、基本的にはNumPy配列へのマーシャリングをするようにしておいたほうがいいかもしれません。
5・まとめ
以上、LabVIEWからPythonを呼び出す方法についての説明でした。
OpenCVについての説明ですが、LabVIEWから使用しようとした際にデータ変換でつまずく方もいらっしゃるかもしれないと思い、解説をさせていただきました。
OpenCVの形式にできれば、Pytorchなどの機械学習ライブラリへの適用もしやすいと思います(OpenCV形式からPytorchの形式に変換する処理などはネットに情報がたくさんあると思うので)。
Python連携を活用すれば、LabVIEWでハードウェア制御と画面構成を行い、Pythonでデータの処理を行うといったことが可能になります。
CEWではLabVIEWの導入・開発の支援も行っておりますので、LabVIEW関連でお困りごとがあれば、問い合わせフォーム、お電話(06-6953-2366(代))などからお気軽にご相談ください。