嵌入式视觉包

传统的机器视觉正在迅速地向嵌入式视觉演进。嵌入式视觉系统不仅外形紧凑,而且能耗更低,性能更高,但最大的问题在于成本。开发嵌入式视觉设备不仅耗时,而且成本高昂。这些高度专业化设备在数据接口、性能、存储空间和用户界面方面存在一定的限制,相比配备标准组件的桌面工作站而言,其在硬件处理和软件开发方面的难度很大。尤其是在进行专有开发(硬件平台、固件和软件)时,您可能需要耗费大量的时间才能取得初步成果。

但目前已有大量的可支持开箱测试的嵌入式标准组件可供使用,特别是在预开发阶段。通过与符合条件的软件解决方案配套使用,您可以快速获得有关视觉应用的洞见。

您可以按照“使用技巧”中列出的几个简单步骤,利用 uEye 相机和 Raspberry Pi 3 实现简单嵌入式视觉应用。

第 1 步:准备硬件

设置搭载 Raspbian 操作系统的 Raspberry Pi 3 设备,并将系统更新至最新软件版本。

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

您可以在网上搜索设置 Raspberry Pi 的方法。对于示范项目,你可以使用几乎任何一款兼容 ARMv7 的嵌入式主机板(例如:Odroid XU4)。不过,搭载四核 CPU 的 Raspberry Pi3 具有强大的功能,足以胜任简单的图像处理任务,并且 Raspbian 操作系统也预装了大量组件。其他的都可以通过软件包源轻松地进行安装。

将 uEye USB 相机连接到 Raspberry Pi 的一个 USB 端口。

pi@raspberrypi:~ $ sudo pip install pyueye

通过该操作可以安装用于搭配 Python 2.7 使用的 uEye Python 接口。PIP 会自动安装所有必要的模块。要检查安装是否正确,您可以使用 Pyhton 解释器,并导入 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

您可以从 Raspbian 软件包源中轻松安装 OpenCV 开发库。虽然软件包提供的版本更低 (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 示例应用程序

下载源代码示例(查看“使用技巧”网站中提供的链接)并将其放入 Raspberry Pi 的目录中,然后通过 uEye 和 Python 接口启动图像处理应用程序

该源代码示例完全使用 Python 编写。您无需针对 Raspberry Pi 的系统架构 (ARMv7 A) 进行交叉编译。因此,该源代码示例独立于平台,并且可直接执行。换言之,如果 Windows 或 Linux 桌面系统中安装了相应的必要组件(uEye 驱动、PyuEye 接口和 Python 2.7),那么您也可以在这些系统中运行该示例源代码。PyuEye 示例源代码包括四个 Python 文件,这些文件为示例程序的不同部分提供以下类和函数:

1) pyueye_example_camera.py

提供了“camera”类,以及常用的相机函数。

2) pyueye_example_gui.py

提供了“PyuEyeQtView”和“PyuEyeQtApp”类,通过这两个类,您可以创建简单的 Qt widget GUI 应用程序。该模块基于 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 对其他处理任务进行测试。您可以直接执行修改后的应用程序,特别是在使用 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++.