組み込みビジョンキット

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

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

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

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

ステップ 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 ポートに接続します。

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
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 が画像データ内から 円を検出して ハイライト表示する
OpenCV が画像データ内から 円を検出して ハイライト表示する

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

Manual

All information at a glance - you can either view the manual online here or download it for offline use.

ReadMe

IDS peak 1.2.1 for Windows

Release Notes

These release notes describe the changes of IDS peak 1.2, which supports Python as an additional programming language besides .NET (incl. C#) and C/C++.