手把手教你实现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进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
随机推荐
- Git_同一个本地仓库上传到不同的远端仓库(github、gitee)
一.背景 github访问.推拉代码都太慢了,于是想把github上面的项目全部迁移到gitee(码云)上,但又不想放弃在github上维护项目,于是想同时维护两个远端仓库 二.准备工作 1.创建相同 ...
- [ vue ] 解耦vuex(按照组件来组织vuex的结构)
问题描述 随着应用复杂度的增加,vuex用一个 store/index.js 文件来描述已经很难维护了,我们想把这些状态分割到单独文件里面. 参考1:https://vuex.vuejs.org/zh ...
- tomcat 服务器的几个重要监听 方法 与 使用
1. 总结一下tomcat 服务器里的三种监听 ServletContextListener HttpSessionListener ServletRequestListener 这是我要做的三个自定 ...
- Java集合为什么设计为:实现类继承了抽象类,同时实现抽象类实现的接口
更好阅读体验:Java集合为什么设计为:实现类继承了抽象类,同时实现抽象类实现的接口 问题 Java集合源码为什么设计为:「实现类继承了抽象类,同时实现抽象类实现的接口?」 看着List 集合的UML ...
- SYCOJ1613递归函数
题目-递归函数 (shiyancang.cn) 记忆化dfs,注意dp的限制范围 #include<bits/stdc++.h> using namespace std; const in ...
- 还在用visio?这款画图工具才是真的绝!
最近有读者私信我,问我推文的配图是用什么工具画的,很好看,也想学习一下.今天就给大家介绍一下这款画图工具--Draw.io 概述 draw.io是一款免费的网页版画图工具(也有桌面版),支持流程图.U ...
- java集合对比汇总
List.Set和Map: List是有序的集合,Set是无序的集合.Map是无序的键值对. HashMap详解: HashMap有两个参数影响其性能:初始容量和加载因子.默认初始容量是16,加载因子 ...
- idea同时启动多个微服务模块进行管理
1,打开IDEA项目中的 .idea 下 的workspace.xml 找到文件中的 RunDashboard 配置块,增加如下圈起来的地方 代码: <option name="con ...
- 【Java】数组
文章目录 数组 一.数组的定义 二.数组的声明与创建 三.内存分析 四.三种初始化 五.数组的四个基本特点 六.数组边界 七.数组的使用 八.多维数组 九.Arrays类 十.稀疏数组 数组 一.数组 ...
- 《剑指offer》面试题59 - I. 滑动窗口的最大值
问题描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5 ...