Blog:
Toradex Linux Python 应用开发

2018年5月29日星期二

Python 编程语言因其极强的可读性、可移植、易于维护,以及丰富的第三方扩展组件,如数据库、数学计算、图形,甚至机器视觉、人工智能、深度学习框架都提供 Python 支持。随着嵌入式处理的计算性能逐渐增强,原来主要用于 PC、服务器端的开发语言,目前也正越来越多地被嵌入式项目所采纳,加速项目的开发,缩短产品上市时间。接下来的内容,我们将介绍如何在 Toradex 的计算机上使用 Python,并演示基于 Python 和 OpenCV 的条形码、二维码扫描功能。

通过 OpenEmbedded/Yocto 集成  Python 和 OpenCV

Toradex 默认的 BSP 中并没有包含Python 和 OpenCV 组件,用户可以通过在线安装或者使用  OpenEmbedded/Yocto 生成包含所需功能的 BSP,我们推荐采用第二种方法,定制化的 BSP 有利于产品进行量产编程。执行下面命令在线安装 Python 以及扩展组件。

root@colibri-imx6:~# opkg update
root@colibri-imx6:~# opkg list | grep python
root@colibri-imx6:~# opkg install python [optionally list additional packages…]

在 OpenEmbedded/Yocto 中可以在 local.conf 中添加下面内容。因为接下来的演示会用到 USB 摄像头,所以在配置  OpenCV 的时候我们开启了  gstreamer 支持。 Zbar 是用于解析条形码、二维码库文件,其支持多种编码格式。

IMAGE_INSTALL_append = " opencv python3 python3-pip zbar"
PACKAGECONFIG_append_pn-opencv = " python3 gstreamer"

最后编译生成 BSP,并通过 Toradex Easy Installer 将其安装到开发板上。

bitbake angstrom-lxde-image

测试 Python 环境

在开发板上打开命令终端,这里我们以 Colibri iMX6 为例。

root@colibri-imx6:~# python3
Python 3.5.3 (default, Apr 11 2018, 16:03:29)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.3.0-dev'

生成的 BSP 包含了 Python 3.5.3 和 OpenCV 3.3。由于 Python 是一种解释型的语言,不需要预编译,你现在就可以直接在 Colibri iMX6 上学习 Python 开发或者运行你现有的  Python 程序。但是这个时候你可能会遇到  Python 模块没有安装的问题,从而无法运行你自己开发的  Python 项目。

Python 模块安装

Python 的一个优势是可以直接在本地下载并安装模块组件,这在嵌入式设备上也同样适用。由于之前在OpenEmbedded/Yocto 中我们已经添加了  python3-pip,那么现在可以是 pip 命令来安装,如 imutils,这是我们接下来所需的组件。

root@colibri-imx6:~# pip3 install imutils

除了在线安装,Python 模块 也可以通过离线交叉编译后进行编译。 Zbar 默认只支持 python2,我们需要安装 pyzbar 来支持我们 BSP 中的  python3。

首先你需要安装 Linux SDK,其提供了所需的交叉编译器、头文件、库文件以及一些基本的编译配置文件。另外建议在开发电脑上也安装和 BSP 上版本一致的 Python。

ben@ben-T430u:~$ cd /usr/local/oecore-x86_64
ben@ben-T430u:~$ . environment-setup-armv7at2hf-neon-angstrom-linux-gnueabi
ben@ben-T430u:~$ export CFLAGS="$CFLAGS -I$SDKTARGETSYSROOT/usr/bin/python3.5m"
ben@ben-T430u:~$ export HOSTPYTHON=/usr/local/bin/python3.5
ben@ben-T430u:~$ $HOSTPYTHON setup.py build
ben@ben-T430u:~$ $HOSTPYTHON setup.py bdist_egg

将编译完成的 pyzbar-0.1.7-py3.5.egg 复制到开发板上,使用  easy_install-3.5 安装

root@colibri-imx6:~# easy_install-3.5 pyzbar-0.1.7-py3.5.egg
Processing pyzbar-0.1.7-py3.5.egg
creating /usr/lib/python3.5/site-packages/pyzbar-0.1.7-py3.5.egg
Extracting pyzbar-0.1.7-py3.5.egg to /usr/lib/python3.5/site-packages
Adding pyzbar 0.1.7 to easy-install.pth file
Installing read_zbar.py script to /usr/bin
Installing read_zbar script to /usr/bin

另外OpenEmbedded 还提供了大量 Python 相关的组件,可以方便地集成到 BSP 中。

到此,我们已经在开发板上完成  Python 环境搭建,所需的组建也都已经安装。下面我们将通过几个  Python 项目来演示条形码、二维码图片的识别,以及在 USB 摄像头上实时读取二维码。

PyZbar 条形码和二维码读取

识别静态图片上的条形码

root@colibri-imx6:~# ./barcode_scanner_image.py -i barcode1.png

识别静态图片上的二维码

root@colibri-imx6:~# ./barcode_scanner_image.py -i QR-tdx.png

通过USB 摄像头实时识二维码

root@colibri-imx6:~# ./barcode_scanner_video.py -o rec.csv

上面的 Python 代码可以从我们的 FTP 服务器上下载。

总结

通过上面的介绍,我们发现借助  Python 可以方便、快捷地实现一些复杂功能,如果采用其他语言工具开发,可能需要更多的代码和时间。由于  Python 本身的特性,在嵌入式上,特别是CPU和 RAM 资源有限的平台,需要充分考虑  Python 运行所带来的开销,确保应用能够可靠运行。

作者: 胡珊逢,FAE,韬睿(上海)

评论

Please login to leave a comment!
Have a Question?