ByToradex
秦海1). 简介Python
编程语言因其极强的可读性、可移植、易于维护,以及丰富的第三方扩展组件,如数据库、数学计算、图形,甚至机器视觉、人工智能、深度学习框架都提供Python
支持。随着嵌入式处理的计算性能逐渐增强,原来主要用于 PC
、服务器端的开发语言,目前也正越来越多地被嵌入式项目所采纳,加速项目的开发,缩短产品上市时间。接下来的内容,我们将介绍如何在嵌入式计算机模块基于 Embedded Linux
使用 Python
,并演示基于 Python
和OpenCV
的条形码、二维码扫描功能。本文所演示的平台来自于ToradexColibri iMX6ARM
嵌入式平台,这是一个基于NXP iMX6 ARM
处理器,支持单核/
双核Cortex-A9
的计算机模块平台。2. 准备a).Colibri iMX6 ARM
核心版配合ColibriEvaBoard载板,连接调试串口UART1
到开发主机方便调试。b).
ColibriiMX6系统默认的 BSP
中并没有包含Python
和 OpenCV
组件,用户可以通过在线安装或者使用基于Ycoto/OpenEmbedded
框架重新编译生成包含所需功能的 BSP
;我们推荐采用第二种方法,定制化的 BSP
有利于产品进行量产编程。./
在线安装 Python
以及扩展组件相关命令------------------------------------root@colibri-imx6:~# opkg updateroot@colibri-imx6:~# opkg list | greppythonroot@colibri-imx6:~# opkg install python[optionally list additional packages…]------------------------------------
./
基于OpenEmbedded框架编译,基本操作请按照这里的说明进行编译,需要修改的文件请参考如下,image
更新方法请参考这里。./local.conf
文件添加如下内容,在生成的image
中增加qtwebengine
组件------------------------------------IMAGE_INSTALL_append = " opencvpython3 python3-pip zbar"PACKAGECONFIG_append_pn-opencv = "python3gstreamer"------------------------------------
3. 测试 Python 环境在开发板上命令终端执行------------------------------------root@colibri-imx6:~# python3Python 3.5.3 (default, Apr 11 2018,16:03:29) [GCC 7.3.0] on linuxType "help","copyright", "credits" or "license" for moreinformation.>>> import cv2>>> cv2.__version__'3.3.0-dev'------------------------------------
生成的 BSP
包含了 Python3.5.3
和OpenCV 3.3
。由于 Python
是一种解释型的语言,不需要预编译,你现在就可以直接在Colibri iMX6
上学习 Python
开发或者运行你现有的 Python
程序。但是这个时候你可能会遇到 Python
模块没有安装的问题,从而无法运行你自己开发的 Python
项目。4. 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_64ben@ben-T430u:~$.environment-setup-armv7at2hf-neon-angstrom-linux-gnueabiben@ben-T430u:~$ exportCFLAGS="$CFLAGS -I$SDKTARGETSYSROOT/usr/bin/python3.5m"ben@ben-T430u:~$ exportHOSTPYTHON=/usr/local/bin/python3.5ben@ben-T430u:~$ $HOSTPYTHON setup.py buildben@ben-T430u:~$ $HOSTPYTHON setup.pybdist_egg------------------------------------
将编译完成的 pyzbar-0.1.7-py3.5.egg
复制到开发板上,使用 easy_install-3.5
安装------------------------------------root@colibri-imx6:~# easy_install-3.5pyzbar-0.1.7-py3.5.egg Processing pyzbar-0.1.7-py3.5.eggcreating/usr/lib/python3.5/site-packages/pyzbar-0.1.7-py3.5.eggExtracting pyzbar-0.1.7-py3.5.egg to /usr/lib/python3.5/site-packagesAdding pyzbar 0.1.7 to easy-install.pthfileInstalling read_zbar.py script to /usr/binInstalling read_zbar script to /usr/bin
------------------------------------
./
另外OpenEmbedded还提供了大量 Python
相关的组件,可以方便地集成到 BSP
中。到此,我们已经在开发板上完成 Python
环境搭建,所需的组建也都已经安装。下面我们将通过几个 Python
项目来演示条形码、二维码图片的识别,以及在 USB
摄像头上实时读取二维码。5. 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代码可以从这里下载。6). 总结通过上面的介绍,我们发现借助 Python
可以方便、快捷地实现一些复杂功能,如果采用其他语言工具开发,可能需要更多的代码和时间。由于 Python
本身的特性,在嵌入式上,特别是CPU
和 RAM
资源有限的平台,需要充分考虑 Python
运行所带来的开销,确保应用能够可靠运行。