テクニカルティップス

組み込みビジョンキット: PyuEyeとOpenCVを使ったプロトタイプ開発

従来のマシンビジョンから組み込みビジョンへの発展は、急速に進んでいます。このコンパクトなシステムではコスト要因が大きな影響力を持ち、性能を強化することで消費電力量を減少させています。しかし、組み込みビジョンデバイスの開発には、長い時間と高いコストがかかります。このような高度に特殊化されたデバイスには、データインターフェース、パフォーマンス、ストレージ容量、ユーザーインターフェースの面で制限があるため、ハードウェアの処理やソフトウェア開発は、標準コンポーネントを搭載したデスクトップワークステーションと比較して非常に困難になっています。とりわけ自社開発 (ハードウェアプラットフォーム、ファームウェア、ソフトウェア) の場合、最初の成果が得られるまでに膨大な時間を失いかねません。

しかし今では、特に開発の前段階で、すぐにテストに利用できる、適切な多数の組み込みコンポーネントが手に入ります。条件に適したソフトウェアソリューションと組み合わせると、ビジョンアプリケーションから最初の成果が瞬時に得られます。

IDS のテクニカルティップスでは、uEye カメラと Raspberry Pi 3 を使用して、シンプルな組み込みビジョンプリケーションを、ほんの数ステップで実装する方法を紹介します。

Python インターフェースと OpenCV を使用した 組み込みビジョンアプリケーション
Python インターフェースと OpenCV を使用した 組み込みビジョンアプリケーション

背景

画像処理の結果を迅速に得るために、OpenCV (Open Computer Vision) OpenSource ライブラリを使用しました。一群のアルゴリズムの他にも、マシンビジョンのさまざまな側面に対するサンプルコードが含まれています。BSD ライセンスのもとで、OpenCV は個人向けおよび商用プロジェクトに対して無償で提供され、Raspbian OS にプリインストールされています。

OpenCV には Python インターフェースが搭載されているため、すばやく簡単に開発を開始できます。また、インタラクティブなアプリケーションプログラミングなど、Python の持つ多数の利点を活用できます。このため、複雑な統合開発環境のセットアップを行くことなく、短いコードスニペットを作成してテストできます。

新しい「PyuEye」インターフェースによって、すべての uEye カメラでオブジェクト指向プログラミング言語 Python を使用できます。OpenCV Python ラッパーと併用すると、Raspberry Pi などの組み込みシステムでのプロと他尾プ開発が簡単になります。

PyuEye インターフェースがインストールされたら、「uEye」モデルを Python アプリケーションにインポートすると、すべての uEye の関数とインストールされている uEye SDK のタイプにアクセスできるようになります。関数呼び出しの構文およびパラメーターについては、uEye のマニュアルに記載されています。

アプローチ

デモプロジェクト用のハードウェアプラットフォームとして、Raspbian OS バージョン「Jessie」を搭載した Raspberry Pi 3USB カメラを使用しました。

デモプロジェクトをできる限りシンプルにするため、Raspbian Jessie と Python Package Index (PyPI) のパッケージソースから取得できるソフトウェアコンポーネントだけを使用しました。

次のソフトウェアコンポーネントを Raspberry Pi にインストールして追加する必要があります。

ステップ 1: ハードウェアを準備する

Raspberry Pi 3 に Raspbian OS をセットアップし、システムを最新のソフトウェアバージョンに更新します。

pi@raspberrypi:~ $ sudo apt-get update && apt-get upgrade

Raspberry Pi のセットアップ手順は、インターネットで検索できます。基本的に、デモには、任意の ARMv7 互換組み込みボード (Odroid XU4 など) を使用できます。ただし、クアッドコア CPU 搭載の Raspberry Pi3 は簡単な画像処理タスクに十分な能力を備え、Raspbian OS には多数のコンポーネントがプリインストールされています。その他のすべては、パッケージソースから簡単にインストールできます。

uEye USB カメラを Raspberry Pi の USB ポートに接続します。

ステップ 2: カメラドライバーとインターフェースをインストールする

最新の組み込み uEye カメラドライバーをインストールします。ドライバーの選択とインストールに関する情報は、uEye Software Suite のダウンロードページにも記載されています。ドライバーが正常にインストールされたら、uEye USB カメラで付属の uEye デモアプリケーションを使用できるようになります。

「PyuEye」についての情報は、Python uEye インターフェースの Web サイトをご覧ください。Pyueye は Python Package Index (https://pypi.org/project/pyueye/) の OpenSource プロジェクトとしてホストされています。パッケージとしてダウンロードするか、Python パッケージ管理プログラム「PIP」から直接インストールできます。必要なすべてのものは、Raspbian にプリインストールされています。

pi@raspberrypi:~ $ sudo pip install pyueye

Python 2.7.で使用される uEye Python インターフェースがインストールされます。必要なモジュール依存関係は、PIP から自動的にインストールされます。

適切なインストールを確認するには、Python インタープリターを使用して、uEye モジュールをインポートします。

pi@raspberrypi:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pyueye import ueye
>>>

エラーメッセージが返されなければ、正常にインストールされています。

ステップ 3: OpenCV をインストールする

OpenCV development ライブラリは Raspbian パッケージソースから簡単にインストールできます。バージョンは古いのですが (2.4.9.1)、今回のデモには十分です。OpenCV ライブラリ向け Python 2.7 バインディングもパッケージソースからインストールできます。Python 3 を使用するには、自分で組み込みプラットフォーム向けにコードソースからコンパイルする必要があります。簡単な手順はオンラインにも公開されています。

pi@raspberrypi:~ $ sudo apt-get install libopencv-dev python-opencv

OpenCV モジュール「cv2」をインポートして、Python インタープリターでインストールをチェックすることもできます。".

ステップ 4: PyuEye サンプルアプリケーションをダウンロードして実行する

サンプルソースコードをダウンロードして、uEye と Python インターフェースで独自の画像処理アプリケーションを開始します。サンプルは、テクニカルティップス Web サイト内にリンクされており、Raspberry Pi のディレクトリに展開されます。

サンプルソースコードは Python のみで作成されています。このため、Raspberry Pi のシステムアーキテクチャ (ARMv7 A) 向けにクロスコンパイルする必要はありません。したがって、プラットフォームに依存しないので、直接実行できます。言い換えると、要件 (uEye ドライバー、PyuEye インターフェース、Python 2.7) が該当するシステム上にインストールされていれば、このサンプルソースコードは Windows や Linux デスクトップでも実行できます。PyuEye サンプルソースコードは、サンプルプログラムのさまざまな部分のクラスと機能を提供する、4 つの Python ファイルで構成されています。

1) pyueye_example_camera.py

カメラ機能でよく使用される「camera」クラスを提供します。

2) pyueye_example_gui.py

クラス「PyuEyeQtView」と「PyuEyeQtApp」により、シンプルな Qt ウィジェット GUI アプリケーションを作成できます。このモジュールは Qt4 をベースとし、 Python Qt4 バインディング (PyQt4) を使用します。Qt4 は Raspbian Jessie に統合済みです。そのため、Python バインディングを次のようにしてパッケージソースからインストールできます。

pi@raspberrypi:~ $ sudo apt-get install python-qt4 python-qt4-doc

3) pyueye_example_utils.py

このモジュールは、便利で重要な関数とクラスを提供し、カメラアプリケーションの開発にとって非常に有用です。例外処理からカメラデータおよび画像保存の管理まで、多数の役に立つオプションが備えられています。

4) pyueye_example_main.py

このメインモジュールはシンプルな Qt アプリケーションフレームワークを作成し、接続されたカメラを開いて初期化し、画像処理コールバック関数を提供します。これにより、OpenCV によるシンプルな画像処理が実現します。実行中のデモからは、接続されたカメラのライブ画像と処理結果のオーバーレイが表示されます。

pi@raspberrypi:~/example $ python pyueye_example_main.py

OpenCV 画像処理

今回の OpenCV によるシンプルな画像処理タスクでは、画像内の円を検索し、ハイライト表示します。

OpenCV には、このタスクに使える cv2.HoughCircles() の完全な実装が含まれているので、メインモジュールに数行のコードを加えるだけで済みます。OpenCV を使用するために、「cv2」と「numpy」がインポートされています。

from pyueye_example_camera import Camera
from pyueye_example_utils import FrameThread
from pyueye_example_gui import PyuEyeQtApp, PyuEyeQtView
from PyQt4 import QtGui

from pyueye import ueye

import cv2
import numpy as np

cv2.HoughCircles() と呼び出しパラメーターの動作原理は、OpenCV のマニュアルに詳しく説明されています。そこで、アプリケーションソースコードに進みます。

画像データは、1 次元 8 ビットデータアレイとして用意する必要があります。pyueye_example_utils.py モジュール内の ImageData クラスの関数「as_1d_array()」と、OpenCV 関数「cvtColor()」が、このタスクを処理します。cv2.HoughCircles() が画像内に円を検出すると、OpenCV 描画関数でハイライト表示します。サンプル Qt アプリケーションが画像データの表示を処理します。

def process_image(self, image_data):

    # reshape the image data as 1dimensional array
    image = image_data.as_1d_image()    
    # make a gray image
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    #image = cv2.medianBlur(image,5)
    # find circles in the image
    circles = cv2.HoughCircles(image, cv2.cv.CV_HOUGH_GRADIENT, 1.2, 100)
    # make a color image again to mark the circles in green
    image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
    
    if circles is not None:
	   # convert the (x, y) coordinates and radius of the circles to integers
	   circles = np.round(circles[0, :]).astype("int") 
	   # loop over the (x, y) coordinates and radius of the circles
	   for (x, y, r) in circles:
		  # draw the circle in the output image, then draw a rectangle
		  # corresponding to the center of the circle
		  cv2.circle(image, (x, y), r, (0, 255, 0), 6)
    
    # show the image with Qt
    return QtGui.QImage(image.data,
                        image_data.mem_info.width,
                        image_data.mem_info.height,
                        QtGui.QImage.Format_RGB888)

アプリケーションは容易に変更でき、他の処理タスクを OpenCV でテストできます。Python の特長として、変更されたアプリケーションを直接実行できます。

 

OpenCV が画像データ内から 円を検出して ハイライト表示する
OpenCV が画像データ内から 円を検出して ハイライト表示する

まとめ

弊社の組み込み uEye カメラドライバーに加えて、もう 1 つのコンポーネントとして新しい PyuEye サードパーティドライバーを導入し、すばやく容易に組み込みビジョンプロジェクトを実現できるようにしました。Python をベースとしたことで、プラットフォームに依存しないアプリケーションで、強力な uEye カメラ SDK を使用できます。Python プログラムコードを Windows デスクトップ PC で開発し、アプリケーションを Raspberry Pi で実行します。異なる開発環境のセットアップは不要です。また、Python は現在最も一般的なプログラミング言語に数えられており、ほぼすべての重要な分野において使用できる可能性が高くなります。Web アプリケーション、ユーザーインターフェース、データ分析および統計、そしてもちろん、画像処理 (OpenCV) に使用できます。Python には大規模なコミュニティがあり、組み込みビジョンへの応用もすでに検討されていました。つまり、uEye Python インターフェースによって、広範な組み込みビジョンキットにアクセスできるのです。

uEye Python インターフェースの詳細については、弊社 Web サイトをご覧ください: 
https://jp.ids-imaging.com/ueye-interface-python.html