痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题之初体验。
接上篇 《走进二维码(QR Code)的世界(1)- 引言》 继续更文,在上一篇文章的最后,痞子衡给出了这个专题的五个阶段推进计划。第一阶段是学习标准QR Code原理,使用Python搭建一个二维码生成与识别平台(基于现有开源库)。你可能会问,为什么第一阶段是基于Python,这其实是痞子衡的习惯。痞子衡每次学习新东西,总喜欢用Python,一是成熟的库多,二是代码简洁写起来快。今天我们来尝试用Python做一个GUI工具,这个工具可以生成和识别二维码,输入文字即可转换成二维码图片,待识别的二维码既可以是本地图片,也可以来自摄像头。在做这个工具的过程中,我们可以对二维码技术的实现有一个初步体验。
一、生成二维码图片 - MyQR
先来找一个二维码生成库,在全球最大的同性交友网站(github)中输入"qrcode",语言选择"Python",便会得到如下结果,可以看到网上已经有2个非常成熟的二维码生成库了,我们就选Star最多的qrcode库吧。
看了一下项目简介,qrcode库非常强大,不仅可以生成普通二维码,还可以生成带图片的艺术二维码(黑白与彩色)、动态二维码(黑白与彩色),我们暂时只用它来生成普通二维码。先安装好Python(痞子衡安装的Python3.6),然后使用pip工具直接安装这个库,这个库在pypi网站的名字是"MyQR",痞子衡安装的是2.3.1版本。
MyQR库的使用足够简单粗暴,一行代码即可。run()函数输入参数很多,我们仅需关注其中的words、version、level、save_name/dir(默认在当前路径生成qrcode.png)即可。run()函数返回结果包括version、level、qr_name(生成的二维码图片路径),你可能会好奇,为啥返回结果里也有version、level,其实这个库会根据输入的words自动匹配出最小的version、level,如果输入的参数小于最小的version、level,库会自动使用最小的version、level。
from MyQR import myqr
version, level, qr_name = myqr.run(
# 待转换的字符串
words,
# 码元结构版本(1-40)
version=1,
# 纠错等级(L, M, Q, H)
level='H',
picture=None,
colorized=False,
contrast=1.0,
brightness=1.0,
# 保存图片名及路径
save_name=None,
save_dir=os.getcwd()
)
二、识别二维码图片 - ZXing
因为MyQR不含识别功能,所以我们还需要再找一个二维码识别库。其实痞子衡早就知道有一个非常知名的开源二维码识别库ZXing("Zebra Crossing")。ZXing项目是Google开发的,基于Java语言实现,主要面向Android平台(是的,安卓手机里的二维码识别都是基于它)。
ZXing是Java语言实现,那Python下怎么使用?别急,人家项目简介里已经给出了各种其他语言下的移植,在Python下可以使用python-zxing库。
痞子衡兴冲冲地打开这个项目,被第一句项目简介就震住了“A quick and dirty wrapper for the ZXing barcode library”。其实这个项目就是简单地在原版ZXing上加了一个壳子,以外部调用的方式执行ZXing的jar包,所以它需要配合下面3个jar包一起工作:
- core.jar下载:https://mvnrepository.com/artifact/com.google.zxing/core
- javase.jar下载:https://mvnrepository.com/artifact/com.google.zxing/javase
- jcommander.jar下载:https://mvnrepository.com/artifact/com.beust/jcommander
jar包全部下载好后连同python-zxing源文件一起放到Python系统目录下:
然后还需要简单修改一下python-zxing源文件(__init__.py)如下,代码中jar包名字要跟你下载的相对应。并且还需要改一下"ZXING_LIBRARY"相关代码,原代码里os.environ.has_key()仅适用Python2,在Python3上os.environ没有has_key()方法。
# 第18行(修改前)
libs = ["javase/javase.jar", "core/core.jar"]
# 第18行(修改后)
libs = ["javase-3.4.0.jar", "core-3.4.0.jar", "jcommander-1.78.jar"]
# 第23行(修改前,仅适用Python2)
if (os.environ.has_key("ZXING_LIBRARY")):
# 第23行(修改后)
if ("ZXING_LIBRARY" in os.environ):
跟着上面代码的改动,正好在系统环境变量里把"ZXING_LIBRARY"添加进去:
python-zxing库的使用也很简单,两句代码即可。待识别的图片不需要是裸二维码图片,图片中只需包含完整二维码即可,zxing库会自动在图片中定位出二维码并识别。关于传入图片的路径,有一个注意地方,如果是绝对路径(比如D:\qrcode.png),则需要将路径转一下格式('\'改成'/')并加上"file:/"前缀(即testimage2)。
from zxing import *
# 待识别的图片
# 相对路径(当前目录下)
testimage1 = "qrcode.png"
# 绝对路径
testimage2 = "file:/D:/qrcode.png"
zx = BarCodeReader()
barcode = zx.decode(testimage2)
# barcode.data即是识别出的字符串
print (barcode.data)
三、从摄像头采集图像 - OpenCV
如果只是识别本地二维码图片,那也太单调了,没有扫一扫的那种快感,再加个摄像头采集功能吧。关于图像处理的东西毫不犹豫地选择大名鼎鼎的跨平台计算机视觉库OpenCV,这么知名的库必然有Python版,pip工具直接安装吧,痞子衡安装的是4.2.0.34。
我们只是用OpenCV做摄像头采集,所以代码相当简单,就是底下这几句。仅有一个注意事项,痞子衡电脑分辨率是1920x1080,摄像头采集的原始图像也是这个长宽比,如果你调用cv2.resize()将尺寸调整到640x640,你会发现实际显示图片是640x360,多余的上下部分是用黑色填充的,摄像头画面长宽比似乎无法被改变。
import cv2
# 创建一个图像捕获对象,0表示计算机内置摄像头,外置摄像头为1、2...
capture = cv2.VideoCapture(0)
while True:
# 从摄像头获取一帧图像
ret, frame = capture.read()
# 图像尺寸调整到 640x640
frame = cv2.resize(frame, (640, 640))
# 显示图像
cv2.imshow('frame', frame)
# 如键盘输入'q',则结束采集
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭窗口
capture.release()
cv2.destroyAllWindows()
四、搭建GUI界面 - PyQt5
二维码生成和识别的库以及摄像头采集库都找到了,现在开始搭个界面。Python的GUI框架非常多,痞子衡推荐用PyQt5,至于原因嘛,谁用谁知道。痞子衡是在试过好几个Python GUI框架之后转到PyQt5就没再离开过。
打开QT的配套界面构建工具Qt Designer,一番控件拖拖拽拽,便有了如下界面设计。界面一共三大区:最上面是生成配置区,用于控制二维码的生成;中间是显示区,生成的二维码以及输入待识别二维码都在这里显示,同时也是摄像头窗口;最下面是识别配置区,用于控制二维码的识别。界面构建完成后直接用pyuic5.exe工具将.ui文件转成.py源文件。
五、工具运行效果
基于前面的准备工作,简单写一些逻辑代码,把上面这些整合起来,便是一个初步小工具,让我们来看看运行效果。输入"https://github.com" 点击【Generate】可以生成相应二维码,点击【Detect】也能根据图片识别出"https://github.com" ,将这个二维码图片拍照,然后选择摄像头输入,将图片放在摄像头面前也能识别出来,大功告成。
至此,走进二维码(QR Code)的世界专题之初体验痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)的更多相关文章
- 痞子衡嵌入式:走进二维码(QR Code)的世界(1)- 引言
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题的引言. 如今二维码可以说是深入走进大家的生活了,推送名片.扫码支付都离不开它,大家几乎每天都会和 ...
- 二维码(QR Code)生成与解析
二维码(QR Code)生成与解析 写在前面 经常在大街上听到扫码送什么什么,如果真闲着没事,从头扫到位,估计书包都装满了各种东西.各种扫各种送,太泛滥了.项目中从没接触过二维码的东东,最近要使用,就 ...
- 二维码QR Code简介及其解码实现(zxing-cpp)
二维码QR Code(Quick Response Code)是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大.可靠性高.可表示汉字及图象多种 ...
- (zxing.net)二维码QR Code的简介、实现与解码
一.简介 二维码QR Code(Quick Response Code)是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大.可靠性高.可表示汉字 ...
- [C#]二维码(QR Code)生成与解析
写在前面 经常在大街上听到扫码送什么什么,如果真闲着没事,从头扫到位,估计书包都装满了各种东西.各种扫各种送,太泛滥了.项目中从没接触过二维码的东东,最近要使用,就扒了扒网络,发现关于解析二维码的类库 ...
- 用ABAP 生成二维码 QR Code
除了使用我的这篇blogStep by step to create QRCode in ABAP Webdynpro提到的使用ABAP webdynpro生成二维码之外,也可以通过使用二维码在线生成 ...
- 痞子衡嵌入式:MCUBootUtility v2.4发布,轻松更换Flashloader文件
-- 痞子衡维护的NXP-MCUBootUtility工具距离上一个版本(v2.3.1)发布过去2个月了,这一次痞子衡为大家带来了版本升级v2.4.0,这个版本主要有一个非常重要的更新需要跟大家特别说 ...
- 痞子衡嵌入式:MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异. 程序函数库是一个包含已经编译好代码和数据的函数集合,这 ...
- 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
随机推荐
- failed to open directory
解决方法: 解决方案的路径不要包含中文!
- (转)协议森林15 先生,要点单吗? (HTTP协议概览)
协议森林15 先生,要点单吗? (HTTP协议概览) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们在TCP流通信中说明了, ...
- 【转】sublime text 2 快捷键大全
Ctrl+L 选择整行(按住-继续选择下行) Ctrl+KK 从光标处删除至行尾 Ctrl+Shift+K 删除整行 Ctrl+Shift+D 复制光标所在整行,插入在该行之前 Ctrl+J 合并行( ...
- 【Weiss】【第03章】练习3.15:自调整链表
[练习3.15] a.写出自调整表的数组实现.自调整表如同一个规则的表,但是所有的插入都在表头进行. 当一个元素被Find访问时,它就被移到表头而并不改变其余的项的相对顺序. b.写出自调整表的链表实 ...
- 在MacOS上利用docker构建buildroot
之前有听说过docker,但是一直没有使用过.最近终于下定决定使用了一下docker,感觉docker用于跨操作系统的软件工具使用还是比较友好的. 适用人群 本文忽略的部分Linux软件包安装的过程, ...
- Delphi10.3的DBGrid中memo类型显示内容而不是(WIDEMEMO)
1]连接好数据库,并显示: 2]增加所有字段: 3]添加事件: // FDQuery1UserName: TWideMemoField; procedure TForm1.FDQuery1Use ...
- Django之路由层和视图层详解
路由层 首先我们来看一下,路由层都有哪些东西,其实你看django很人性化,将所有的介绍都放在了简介里面,不信,你看
- 动态规划-买卖股票的最佳时机 V
2020-03-11 18:19:00 问题描述: 给出一个股票n天的价格,每天最多只能进行一次交易,可以选择买入一支股票或卖出一支股票或放弃交易,输出能够达到的最大利润值 样例 样例 1: 给出 ` ...
- Java 获取 IP
/** * 获取访问者IP. * 在一般情况下使用 Request.getRemoteAddr() 即可,但是经过 nginx 等反向代理软件后,这个方法会失效. */ private String ...
- iOS UITableView优化
一.Cell 复用 在可见的页面会重复绘制页面,每次刷新显示都会去创建新的 Cell,非常耗费性能. 解决方案:创建一个静态变量 reuseID,防止重复创建(提高性能),使用系统的缓存池功能. s ...