嵌入式视觉包

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

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

您可以按照“使用技巧”中列出的几个简单步骤,利用 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 的情况下。