我是 雪天鱼,一名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条形码识别的更多相关文章

  1. Pytorch入门——手把手教你MNIST手写数字识别

    MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...

  2. UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包

    背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...

  3. 手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)

    转自:http://www.th7.cn/Program/cp/201407/242762.shtml 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言 ...

  4. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  5. 手把手教你ranorex_android自动化测试第一个示例

    要说android的自动化,那真是折腾死我了,从早期的monkeyrunner,到后来的robotium,再到最新的uiautomator,各有各的问题,总之性价比都不够高,不太适合我的使用场景.于是 ...

  6. 手把手教你webpack、react和node.js环境配置(上篇)

    很多人刚学习react的时候,往往因为繁琐的配置而头疼,这里我将手把手教大家怎么用webpack配置react和redux的环境,这篇教程包括前端react和后台node整个网站的环境配置,对node ...

  7. 【技术分享】手把手教你使用PowerShell内置的端口扫描器

    [技术分享]手把手教你使用PowerShell内置的端口扫描器 引言 想做端口扫描,NMAP是理想的选择,但是有时候NMAP并不可用.有的时候仅仅是想看一下某个端口是否开放.在这些情况下,PowerS ...

  8. 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

  9. 周一干货~手把手教你安装 Visual Studio 安卓模拟器

    干货~手把手教你安装 Visual Studio 安卓模拟器 转 http://mini.eastday.com/mobile/171107134734194.html# 今天软妹为大家带来一篇来自M ...

  10. 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

随机推荐

  1. Git_同一个本地仓库上传到不同的远端仓库(github、gitee)

    一.背景 github访问.推拉代码都太慢了,于是想把github上面的项目全部迁移到gitee(码云)上,但又不想放弃在github上维护项目,于是想同时维护两个远端仓库 二.准备工作 1.创建相同 ...

  2. [ vue ] 解耦vuex(按照组件来组织vuex的结构)

    问题描述 随着应用复杂度的增加,vuex用一个 store/index.js 文件来描述已经很难维护了,我们想把这些状态分割到单独文件里面. 参考1:https://vuex.vuejs.org/zh ...

  3. tomcat 服务器的几个重要监听 方法 与 使用

    1. 总结一下tomcat 服务器里的三种监听 ServletContextListener HttpSessionListener ServletRequestListener 这是我要做的三个自定 ...

  4. Java集合为什么设计为:实现类继承了抽象类,同时实现抽象类实现的接口

    更好阅读体验:Java集合为什么设计为:实现类继承了抽象类,同时实现抽象类实现的接口 问题 Java集合源码为什么设计为:「实现类继承了抽象类,同时实现抽象类实现的接口?」 看着List 集合的UML ...

  5. SYCOJ1613递归函数

    题目-递归函数 (shiyancang.cn) 记忆化dfs,注意dp的限制范围 #include<bits/stdc++.h> using namespace std; const in ...

  6. 还在用visio?这款画图工具才是真的绝!

    最近有读者私信我,问我推文的配图是用什么工具画的,很好看,也想学习一下.今天就给大家介绍一下这款画图工具--Draw.io 概述 draw.io是一款免费的网页版画图工具(也有桌面版),支持流程图.U ...

  7. java集合对比汇总

    List.Set和Map: List是有序的集合,Set是无序的集合.Map是无序的键值对. HashMap详解: HashMap有两个参数影响其性能:初始容量和加载因子.默认初始容量是16,加载因子 ...

  8. idea同时启动多个微服务模块进行管理

    1,打开IDEA项目中的 .idea 下 的workspace.xml 找到文件中的 RunDashboard 配置块,增加如下圈起来的地方 代码: <option name="con ...

  9. 【Java】数组

    文章目录 数组 一.数组的定义 二.数组的声明与创建 三.内存分析 四.三种初始化 五.数组的四个基本特点 六.数组边界 七.数组的使用 八.多维数组 九.Arrays类 十.稀疏数组 数组 一.数组 ...

  10. 《剑指offer》面试题59 - I. 滑动窗口的最大值

    问题描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5 ...