手把手教你实现pynq-z2条形码识别
我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索和SOC设计。
关注公众号,拉你进“IC设计交流群
”。
1.前言
单单实现一个二维码识别就花了将近一个星期,这篇文章我就详细介绍这段时间走过的坑,代码附在文末,着急需要的小伙伴直接翻到最后即可
2. linux配置
要想实现本项目,首先解决以下三大要点
,也着实浪费了很多时间
2.1解决pynq联网
pynq联网的教程网上可谓是不少,但是我却整了很久。
首先是在家里,我采用
所示的方法,然后成功ping通外网
在学校时这个方法却解决不了,我尝试了网上很多方法都无法解决(可能我太菜了),最终在重新烧录了几次镜像后发现:直接把网线连到宿舍的路由器上就连上外网了…
具体还有关于修改下载源变为镜像源的方法可以参考其他博客
2.2解决pyzbar库下载
这个库下载推荐采用
pip3 install pyzbar
这个库安装的路径也要注意,命令行下输入
pip3 show pyzbar
我的在这里:
图 2.2.1. pyzbar的位置
多说一句,下面的zbar
包我采用
sudo apt-get install python-zbar
得到,为什么不用pip3,因为pip3下载这个总是报错,即使是
pip3 upgrade
也不行,不是pip3版本的问题。
我的linux镜像是v2.3
版本的,不知道大家采用v2.5
或者更高会不会好些
图 2.2.2. zbar的位置
2.3解决jupyter导入库
2.3.1 首先说明问题的由来
我发现使用
pip3 install pillow
PIL在jupyter下能导入,但是却不能导入pyzbar
又发现在命令行输入 python3
后,可以导入pyzbar,但不能导入zbar
图 2.3.1. python3导入pyzbar成功,导入zbar不成功
我在命令行输入pyhton
解释器下发现不能导入pyzbar
,但可以导入zbar
这就引起了我的注意,最终我发现原来pip3
来的pyzbar
有单独的存储路径,apt-get
同理
至于为什么python和python3不能引入相同的包
那就得
import sys
sys.path
采用语句来观察,发现引用路径不一致。我想我知道了症结所在:
图 2.3.2. 不太通顺的解释
$color{#FF3030}{红字}$不太通顺,翻译成 人话 就是:
jupyter要设置为 支持引用 存储pyzbar包的路径
2.3.2 方法一:
修改环境变量
说明,以下为引用:
文章源地址:
https://blog.csdn.net/c20081052/article/details/79715132
Linux 下设置环境变量有三种方法,一种用于当前终端,一种用于当前用户,一种用于所有用户:
一:用于当前终端:
在当前终端中输入:export PATH=$PATH:<你的要加入的路径>
不过上面的方法只适用于当前终端,一旦当前终端关闭或在另一个终端中,则无效。
export NDK_ROOT=/home/jiang/soft/Android-ndk-r8e
只能在当前终端使用。
二:用于当前用户:
在用户主目录下有一个 .bashrc 隐藏文件,可以在此文件中加入 PATH 的设置如下:
$ gedit ~/.bashrc
加入:
export PATH=<你的要加入的路径>:$PATH
如果要加入多个路径,只要:
export PATH=<你要加入的路径1>:<你要加入的路径2>: ...... :$PATH
当中每个路径要以冒号分隔。
这样每次登录都会生效
添加PYTHONPATH的方法也是这样,在.bashrc中添加
export PYTHONPATH=/home/zhao/setup/caffemaster/python:/home/zhao/setup/mypy:$PYTHONPATH
保存后在终端输入 $ source ~/.bashrc
使环境变量立即生效
三:用于所有用户:
$ sudo gedit /etc/profile
加入:
export PATH=<你要加入的路径>:$PATH
就可以了。
终端输入:echo $PATH
可以查看环境变量
注意,修改环境变量后,除了第一种方法立即生效外,第二第三种方法要立即生效,可以source ~/.bashrc或者注销再次登录后就可以了!
到此引用结束
2.3.3 方法二 :
在代码中加入语句
import sys
sys.path
sys.path.append("/home/xilinx/.local/lib/python3.6/site-packages")
sys.path
是查看jupyter
的库查找路径,可以查看你的jupyter是否包括了你的包的路径
一般来说库导入失败都是由于这个原因——jupyter库路径
这是设置引用额外引用路径的方法:
sys.path.append("")
可参考这篇文章:
https://www.cnblogs.com/mandy-study/p/7735801.html
3. 提供代码
# 关键识别代码
barcodes = decode(image)
def decode (image,barcodes):
# loop over the detected barcodes
for barcode in barcodes:
# extract the bounding box location of the barcode and draw the
# bounding boxr surrounding the barcode on the image
(x, y, w, h) = barcode.rect
cv2.rectangle(image, (x, y),(x + w,y + h), (255, 0, 0), 5)
# the barcode data is a bytes object so if we want to draw it on
# our output image wre need to convert it to a string first
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type
# draw the barcode data and barcode type on the image
text ="{} ({})". format(barcodeData,barcodeType)
cv2.putText(image,text,(x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,.8, (255, 0, 0), 2)
# print the barcode type and data to the terminal
print("[INFO] Found {} barcode: {}".format(barcodeType,barcodeData))
plt.figure(figsize=(10,10))
plt.imshow(image)
plt.show()
# Decoding barcodes
decode(image,barcodes)
最终结果,发现框框并不是很贴合,可能是照片照的问题。但是识别的结果完全正确
完整代码请见连接:
https://download.csdn.net/download/weixin_44360347/15816188
打开是.ipynb格式。
- 更多技术文章和学习资料,请关注我的公众号:【集成电路设计教程】
- 全平台统一:【雪天鱼】