手把手教你实现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格式。
- 更多技术文章和学习资料,请关注我的公众号:【集成电路设计教程】
- 全平台统一:【雪天鱼】
手把手教你实现pynq-z2条形码识别的更多相关文章
- Pytorch入门——手把手教你MNIST手写数字识别
MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...
- UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包
背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...
- 手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)
转自:http://www.th7.cn/Program/cp/201407/242762.shtml 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言 ...
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...
- 手把手教你ranorex_android自动化测试第一个示例
要说android的自动化,那真是折腾死我了,从早期的monkeyrunner,到后来的robotium,再到最新的uiautomator,各有各的问题,总之性价比都不够高,不太适合我的使用场景.于是 ...
- 手把手教你webpack、react和node.js环境配置(上篇)
很多人刚学习react的时候,往往因为繁琐的配置而头疼,这里我将手把手教大家怎么用webpack配置react和redux的环境,这篇教程包括前端react和后台node整个网站的环境配置,对node ...
- 【技术分享】手把手教你使用PowerShell内置的端口扫描器
[技术分享]手把手教你使用PowerShell内置的端口扫描器 引言 想做端口扫描,NMAP是理想的选择,但是有时候NMAP并不可用.有的时候仅仅是想看一下某个端口是否开放.在这些情况下,PowerS ...
- 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 周一干货~手把手教你安装 Visual Studio 安卓模拟器
干货~手把手教你安装 Visual Studio 安卓模拟器 转 http://mini.eastday.com/mobile/171107134734194.html# 今天软妹为大家带来一篇来自M ...
- 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
随机推荐
- yum方式安装nginx
1.添加CentOS 7 Nginx yum资源库 [root@localhost ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPM ...
- SQL server - if else 与 else if 的正确使用
两层判断 if a>2 begin print 'a大于2' end else begin print 'a小于等于2' end 注意了 begin - end 之间的代码块不允许空,必须有指 ...
- Centos 7.6关闭selinux
查看selinux状态 [root@localhost ~]# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SE ...
- 《剑指offer》面试题20. 表示数值的字符串
问题描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100"."5e2"."-123"."3.1 ...
- 「Python实用秘技04」为pdf文件批量添加文字水印
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第4期 ...
- Servlet-HttpServletResponse类介绍及作用和两个响应流介绍
Servlet-HttpServletResponse类 HttpServletResponse类和HttpServletRequest类一样.每次请求进来,Tomcat服务器都会创建一个Respon ...
- JavaScript设计原则与编程技巧
1 设计原则概述 <UNIX/LINUX设计哲学>设计准则 ① 小既是美. ② 每个程序只做一件事情. ③ 快速建立原型. ④ 舍弃高效率而取可移植性. ⑤ 避免强制性的图形化界面交互. ...
- ORB_SLAM3 + ROS采坑实录(从零开始的毕设生活第一弹)
ORB-SLAM3配置 https://github.com/UZ-SLAMLab/ORB_SLAM3 https://github.com/shanpenghui/ORB_SLAM3_Fixed E ...
- Vue之 watch、computed、filter之间的区别与使用场景
computed 计算属性: 当页面中需要使用大量的表达式处理数据时,为了页面维护更加简单,所以使用 计算属性 来出来复杂的逻辑运算 watch 侦听器 当需要在数据变化时执行异步或开销较大的操作时 ...
- Ubuntu 配置数据库开发环境(mysql oracle mssqlserver sybase)
1.mysql sudo apt-get install libmysql++-dev //mysql连接库 2.ms sql server/sybase ./configure --prefix=/ ...