百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

走进二维码(QR Code)的世界之初体验

bigegpt 2024-12-15 11:27 4 浏览

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是走进二维码(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 版本。

  • 安装地址: https://pypi.org/project/MyQR/

MyQR 库的使用足够简单粗暴,一行代码即可。run函数输入参数很多,我们仅需关注其中的 words、version、level、save_name/dir(默认在当前路径生成 qrcode.png)即可。run函数返回结果包括 version、level、qr_name(生成的二维码图片路径),你可能会好奇,为啥返回结果里也有 version、level,其实这个库会根据输入的 words 自动匹配出最小的 version、level,如果输入的参数小于最小的 version、level,库会自动使用最小的 version、level。

 1from MyQR import myqr
 2
 3version, level, qr_name = myqr.run(
 4 # 待转换的字符串
 5 words,
 6 # 码元结构版本(1-40)
 7 version=1,
 8 # 纠错等级(L, M, Q, H)
 9 level='H',
10 picture=None,
11 colorized=False,
12 contrast=1.0,
13 brightness=1.0,
14 # 保存图片名及路径
15 save_name=None,
16 save_dir=os.getcwd
17 )

二、识别二维码图片 - ZXing

因为 MyQR 不含识别功能,所以我们还需要再找一个二维码识别库。其实痞子衡早就知道有一个非常知名的开源二维码识别库 ZXing("Zebra Crossing")。ZXing 项目是 Google 开发的,基于 Java 语言实现,主要面向 Android 平台(是的,安卓手机里的二维码识别都是基于它)。

  • 项目地址:https://github.com/zxing/zxing

ZXing 是 Java 语言实现,那 Python 下怎么使用?别急,人家项目简介里已经给出了各种其他语言下的移植,在 Python 下可以使用 python-zxing 库。

  • 项目地址:https://github.com/oostendo/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方法。

1# 第 18 行(修改前)
2    libs = ["javase/javase.jar", "core/core.jar"]
3# 第 18 行(修改后)
4    libs = ["javase-3.4.0.jar", "core-3.4.0.jar", "jcommander-1.78.jar"]
5
6# 第 23 行(修改前,仅适用 Python2)
7        if (os.environ.has_key("ZXING_LIBRARY")):
8# 第 23 行(修改后)
9        if ("ZXING_LIBRARY" in os.environ):

跟着上面代码的改动,正好在系统环境变量里把"ZXING_LIBRARY"添加进去:

  • 修改后的完整包:https://github.com/JayHeng/pzh-qrcode/tree/master/python/lib/zxing

python-zxing 库的使用也很简单,两句代码即可。待识别的图片不需要是裸二维码图片,图片中只需包含完整二维码即可,zxing 库会自动在图片中定位出二维码并识别。关于传入图片的路径,有一个注意地方,如果是绝对路径(比如 D:\qrcode.png),则需要将路径转一下格式('\'改成'/')并加上"file:/"前缀(即 testimage2)。

 1from zxing import *
 2
 3# 待识别的图片
 4# 相对路径(当前目录下)
 5testimage1 = "qrcode.png"
 6# 绝对路径
 7testimage2 = "file:/D:/qrcode.png"
 8
 9zx = BarCodeReader
10barcode = zx.decode(testimage2)
11# barcode.data 即是识别出的字符串
12print (barcode.data)

三、从摄像头采集图像 - OpenCV

如果只是识别本地二维码图片,那也太单调了,没有扫一扫的那种快感,再加个摄像头采集功能吧。关于图像处理的东西毫不犹豫地选择大名鼎鼎的跨平台计算机视觉库 OpenCV,这么知名的库必然有 Python 版,pip 工具直接安装吧,痞子衡安装的是 4.2.0.34。

  • 安装地址: https://pypi.org/project/opencv-python/

我们只是用 OpenCV 做摄像头采集,所以代码相当简单,就是底下这几句。仅有一个注意事项,痞子衡电脑分辨率是 1920x1080,摄像头采集的原始图像也是这个长宽比,如果你调用 cv2.resize将尺寸调整到 640x640,你会发现实际显示图片是 640x360,多余的上下部分是用黑色填充的,摄像头画面长宽比似乎无法被改变。

 1import cv2
 2
 3# 创建一个图像捕获对象,0 表示计算机内置摄像头,外置摄像头为 1、2...
 4capture = cv2.VideoCapture(0)
 5
 6while True:
 7    # 从摄像头获取一帧图像
 8    ret, frame = capture.read
 9    # 图像尺寸调整到 640x640
10    frame = cv2.resize(frame, (640, 640))
11    # 显示图像
12    cv2.imshow('frame', frame)
13    # 如键盘输入'q',则结束采集
14    if cv2.waitKey(1) & 0xFF == ord('q'):
15        break
16
17# 释放摄像头并关闭窗口
18capture.release
19cv2.destroyAllWindows

四、搭建 GUI 界面 - PyQt5

二维码生成和识别的库以及摄像头采集库都找到了,现在开始搭个界面。Python 的 GUI 框架非常多,痞子衡推荐用 PyQt5,至于原因嘛,谁用谁知道。痞子衡是在试过好几个 Python GUI 框架之后转到 PyQt5 就没再离开过。

打开 QT 的配套界面构建工具 Qt Designer,一番控件拖拖拽拽,便有了如下界面设计。界面一共三大区:最上面是生成配置区,用于控制二维码的生成;中间是显示区,生成的二维码以及输入待识别二维码都在这里显示,同时也是摄像头窗口;最下面是识别配置区,用于控制二维码的识别。界面构建完成后直接用 pyuic5.exe 工具将 .ui 文件转成 .py 源文件。

五、工具运行效果

基于前面的准备工作,简单写一些逻辑代码,把上面这些整合起来,便是一个初步小工具,让我们来看看运行效果。输入"https://github.com" 点击【Generate】可以生成相应二维码,点击【Detect】也能根据图片识别出"https://github.com" ,将这个二维码图片拍照,然后选择摄像头输入,将图片放在摄像头面前也能识别出来,大功告成。

  • 项目地址:https://github.com/JayHeng/pzh-qrcode/tree/master/python

至此,走进二维码(QR Code)的世界专题之初体验痞子衡便介绍完毕了,掌声在哪里~~~

相关推荐

了解Linux目录,那你就了解了一半的Linux系统

大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...

Linux命令,这些操作要注意!(linux命令?)

刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...

Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!

在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...

linux必学的60个命令(linux必学的20个命令)

以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

15 个实用 Linux 命令(linux命令用法及举例)

Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...

Linux 常用命令集合(linux常用命令全集)

系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux常用文件操作命令(linux常用文件操作命令有哪些)

ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...

Linux 常用命令(linux常用命令)

日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E&#...

简单粗暴收藏版:Linux常用命令大汇总

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...

「Linux」linux常用基本命令(linux常用基本命令和用法)

Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...

Linux的常用命令就是记不住,怎么办?于是推出了这套教程

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux的30个常用命令汇总,运维大神必掌握技能!

以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...

Linux/Unix 系统中非常常用的命令

Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...