如何将PYNQ与OpenMV摄像头结合使用,加速图像处理
图像处理是多种应用的关键,从视觉引导的机器人到工业领域的机器视觉系统都离不开它。
在本项目中,我们将探讨如何将OpenMV摄像头与运行PYNQ的Ultra96进行融合。这使得我们的PYNQ应用程序能够将部分图像处理任务委托给摄像头完成,从而提升系统性能,并通过PYNQ使Ultra96能够与OpenMV生态系统协同工作。
什么是OpenMV摄像头?
OpenMV摄像头是一种低成本的机器视觉摄像头,采用Python开发而成。得益于其独特的架构设计,我们可以在摄像头上卸载部分图像处理任务。也就是说,Ultra96接收到的图像帧已经包含了面部识别、眼睛追踪或Sobel滤波等预处理功能,具体取决于我们对OpenMV摄像头的配置方式。
由于OpenMV摄像头设计为可扩展,它提供了10个外部I/O接口,可用于驱动外部传感器。这10个设备能够支持从UART到SPI、I2C和PWM等多种接口。当然,PWM在驱动舵机时非常有用。
OpenMV摄像头的一个非常实用的功能是其LED灯组(OpenMV M7)配备了一个三色LED,可输出红色、绿色和蓝色,并另有一个独立的红外LED。由于传感器对红外光敏感,这一功能在低光环境下表现尤为出色。
OpenMV摄像头的工作原理
OpenMV摄像头使用Micro Python来控制图像采集器,并通过USB链路输出图像帧。Micro Python专为微控制器设计,基于Python 3.4。要使用OpenMV摄像头,我们首先需要编写一个Micro Python脚本,配置摄像头以实现所需算法。然后通过上传并运行该脚本,即可完成数据传输。
这意味着我们需要在主机机器上安装一些OpenMV API和库,以便与OpenMV摄像头进行通信。
为了开发脚本并确保其正常工作,OpenMV IDE发挥了重要作用。它允许我们开发和测试脚本,之后再将其用于Ultra96应用程序中。
我们可以使用Windows、Mac或Linux桌面系统来开发这个脚本。
使用 OpenMV IDE 创建 OpenMV 脚本
要开始使用 OpenMV IDE,我们首先需要下载并安装它。安装完成后,下一步是通过 USB 线将我们的 OpenMV 摄像头连接到 IDE,然后运行脚本。
我们可以先运行提供的示例“Hello World”,该示例会将摄像头配置为以 QVGA 分辨率输出标准 RGB 图像。在 IDE 的右侧,您可以看到摄像头输出的图像。
我们可以利用这个 IDE 开发针对 OpenMV 摄像头的脚本,例如下面这个脚本,用于检测和识别捕获图像中的圆形。
请注意,当摄像头连接到 IDE 时,帧率会降低。
我们可以将这里开发的脚本应用到 Ultra96 PYNQ 实现中,接下来让我们看看如何设置 Ultra96 和 PYNQ。
设置 Ultra96 PYNQ 图像
如果尚未完成,第一步是下载并创建一个 PYNQ SD 卡,以便在 Ultra96 上运行 PYNQ 框架。
由于我们希望使用 Xilinx 图像处理叠加层,因此应从此处下载 Ultra96 PYNQ v2.3 图像。
一旦拥有此图像,创建SD卡就非常简单:从压缩文件中提取ISO镜像,并将其写入SD卡。为了将ISO镜像写入SD卡,我们需要使用如Etcher或Win32 Disk Imager之类的程序。
有了SD卡后,我们就可以启动Ultra96,并通过以下方式连接到PYNQ框架:
- 使用MicroUSB接口的USB以太网连接(上行USB连接)。
- 通过Wi-Fi连接。
- 将Ultra96用作单板计算机,并连接显示器、键盘和鼠标。
本项目我选择了USB以太网连接方式。
接下来需要确保安装了必要的覆盖层,以便将图像处理功能加速至可编程逻辑中。为此,我们需要安装PYNQ计算机视觉覆盖层。
下载图像处理覆盖层
安装该覆盖层非常简单。打开浏览器窗口,访问192.168.3.1(USB以太网地址),这将打开Jupyter笔记本的登录页面,密码为Xilinx。
登录后,您会看到以下文件夹和脚本
点击“新建”并选择“终端”,这将在浏览器窗口中打开一个新终端窗口。要下载并使用PYNQ计算机视觉叠加层,我们输入以下命令:
下载完成后,如果您返回Jupyter主页,会看到一个名为pynqOpenCV的新目录。
通过这些Jupyter笔记本,我们可以测试图像处理性能,当我们将OpenCV函数加速到可编程逻辑时。
通常情况下,如上图所示,硬件加速的性能远优于在软件(SW)中实现算法的性能。
当然,我们也可以从自己的Jupyter笔记本中调用这个叠加层。
在PYNQ中设置OpenMV摄像头
下一步是配置Ultra96 PYNQ实例,使其能够通过其API控制OpenMV摄像头。我们可以通过在Ultra96的终端窗口中运行以下命令来下载OpenMV的git仓库。
下载完成后,我们需要将pyopenmv.py文件从openmv/tools移动到/usr/lib/python3.6目录下。
这样,我们就可以在Jupyter应用程序中控制OpenMV摄像头了。
为了实现这一点,我们需要知道OpenMV摄像头所枚举的串行端口是哪一个。这通常会是 ttyACM0 或 ttyACM1,我们可以通过在 /dev 目录下执行 ls 命令来确认。
现在,我们可以开始在应用程序中使用 OpenMV 摄像头了。让我们来看看如何在 Jupyter 脚本中设置它。
OpenMV 摄像头的初步测试
在新的 Jupyter 笔记本中,首先需要导入必要的包,其中包括刚刚安装的 pyopenmv。
我们还会导入 numpy,因为图像将以 numpy 数组的形式返回,以便我们能够使用 numpy 的功能进行显示。
第一步是定义我们在 IDE 中开发的脚本。对于“首次光照”实验,使用 PYNQ 和 OpenMV 时,我们将采用一个“Hello World”示例脚本,以获取一张简单的图像。
一旦脚本定义完成,下一步就是连接到 OpenMV 摄像头并下载该脚本。
最后,在脚本下载并运行完毕后,我们需要能够读取帧缓冲区。下面这个单元格将读取帧缓冲区,并将其保存为 jpg 文件,存储在 PYNQ 文件系统中。
当我运行此脚本时,收到了下方第一张光照图像,当时我正在办公室工作。
完成上述步骤后,下一步就是开始在PYNQ Jupyter笔记本中使用高级脚本。采用与上文相同的方法,我们可以重新定义脚本,用于不同的处理任务,包括:
对MiniZed板进行成像时的Canny边缘检测
或者,我们还可以从图像中提取关键点,以便在后续图像中进行跟踪。
圆形检测
这种将处理任务卸载到OpenMV摄像头或运行Pynq的Ultra96可编程逻辑的融合方式,为系统设计者提供了最大的灵活性。
本文编译自hackster.io





