使用技巧

利用 uEye Python 接口和 Open CV 进行原型开发

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

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

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

利用 uEye Python 接口 和 OpenCV 实现嵌入式视觉应用
利用 uEye Python 接口 和 OpenCV 实现嵌入式视觉应用

背景

为快速获得图像处理结果,我们使用了 OpenCV(开源计算机视觉)开源库。该开源库不仅支持一系列算法,而且还为机器视觉的方方面面提供示例代码。获得 BSD 许可后,您可以在个人和商业项目中免费使用 OpenCV。OpenCV 预先安装了 Raspbian 操作系统。

OpenCV 提供了一个 Python 接口,便于快速启动和轻松开发。您可以利用 Python 接口提供的各种优势,例如:交互式应用程序编程。这样您无需大费周折设置一套完整的开发环境,即可编写小段代码并对其进行测试。

借助新的“PyuEye”接口,您可以对所有的 uEye 相机使用面向对象的 Python 语言进行编程。与 OpenCV Python 包装器配套使用时,可以轻松地在嵌入式系统(包括 Raspberry Pi)中进行原型开发。

安装完 PyuEye 接口后,您可以将“uEye”模块导入到 Python 应用程序中,以便访问已安装 uEye SDK 的功能和类型。《uEye 用户手册》中详细介绍了这些功能的调用语法和参数。

方法

我们使用了搭载 Raspbian “Jessie” 操作系统的 Raspberry Pi 3 和一台 uEye USB 相机作为我们示范项目的硬件平台。

为了让示范项目尽可能地简单一点,我们仅使用了 Raspbian Jessie 的软件包中提供的软件组件和 Python 包索引 (PyPI)。

您需要在 Raspberry Pi 中另外安装以下软件组件:

第 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 端口。

第 2 步:安装相机驱动和接口

安装最新的嵌入式 uEye 相机驱动。关于如何选择与安装驱动,请参阅 uEye 软件套装下载页面。驱动安装成功后,您可以利用自带的 uEye 演示应用程序使用 uEye USB 相机。

有关 PyuEye 的详细信息,请参阅 Python uEye 接口网站。PyuEye 被作为开源项目托管在 Python 包索引 (https://pypi.org/project/pyueye/) 中。您可以通过软件包的方式将其下载下来,或者通过 Python 软件包管理程序 (PIP) 直接安装 PyuEye。Raspbian 操作系统已预装所有必要的软件组件。

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

OpenCV 文档中已详细介绍了cv2. HoughCircles() 函数的功能原则及其调用参数。所以我们直接讨论应用程序源代码。

图像数据必须为 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 相机驱动基础上还推出了最新的 PyuEye 第三方接口,帮助您快速、轻松地实现嵌入式视觉项目。在以 Python 为基础的背景下,您可以在独立于平台的应用程序中体验 uEye 相机 SDK 的强大功能。您无需设置不同的开发环境,只需在安装 Windows 系统的台式电脑上编写 Python 程序代码,然后在 Raspberry Pi 上运行应用程序即可。此外,Python 是当前最通用的编程语言之一,因此您可以获得几乎所有重要领域的 Web 框架,包括网络应用、用户界面、数据分析与统计,还有图像处理(例如,OpenCV)。Python 拥有一个已进行嵌入式视觉开发的庞大社区。通过 uEye Python 接口,您可以访问超大型嵌入式视觉工具包。

有关 uEye PyuEye 接口的更多信息,请访问以下网站:
https://cn.ids-imaging.com/ueye-interface-python.html