Python实现扫码工具的示例代码


Posted in Python onOctober 09, 2020

二维码作为一种信息传递的工具,在当今社会发挥了重要作用。从手机用户登录到手机支付,生活的各个角落都能看到二维码的存在。那你知道二维码是怎么解析的吗?有想过自己实现一个扫码工具吗?如果想的话就继续看下去吧!

一、案例分析

我们先思考一下,实现扫码工具需要写什么操作。在扫码过程中我们需要打开摄像头,如何由手机或者电脑识别二维码。所以我们要实现两个关键的步骤:调用摄像头、识别二维码。

这两个操作分别对应了两个模块,它们就是opencv和pyzbar,其中opencv是英特尔的计算机视觉处理模块,而pyzbar则是用于解析二维码的模块。

二、环境

环境包括python环境和模块。我的环境如下:

系统:Windows 10
python:python 3.7.9
opencv:opencv-python-4.4.0.44
pyzbar:pyzbar-0.1.8

模块安装很简单,我们直接用pip安装,先安装opencv模块:

pip install opencv-python

然后是pyzbar模块:

pip install pyzbar

在未指定安装版本时,系统会自动安装最新版。安装好模块后,我们就可以来实现扫码工具了。

三、识别二维码

有了pyzbar模块后,我们识别二维码的工作就非常简单了,首先需要准备一张二维码。有了二维码后就可以开始解析了,具体步骤如下:

  • 读取二维码图片
  • 解析二维码中的数据
  • 在解析出的数据中提取data信息

实现代码如下:

import cv2
from pyzbar import pyzbar
# 1、读取二维码图片
qrcode = cv2.imread('qrcode.jpg')
# 2、解析二维码中的数据
data = pyzbar.decode(qrcode)
print(data)
# 3、在数据中解析出二维码的data信息
text = data[0].data.decode('utf-8')
print(text)

在上面我们解析了两次,第一次获取了一个data,我们先来看看data长什么样子:

[Decoded(data=b'http://weixin.qq.com/r/vC_fhynEKnRVrW3k93qu', type='QRCODE', rect=Rect(left=140, top=113, width=390, height=390), polygon=[Point(x=140, y=113), Point(x=140, y=503), Point(x=530, y=503), Point(x=530, y=113)])]

可以看到是一个列表,而且列表的第一个数据包含url的信息。所以我们需要通过下面的代码再次解析:

text = data[0].data.decode('utf-8')

这样我们就能拿到二维码中包含的信息了。为了方便后续使用,可以将上面的代码写成一个函数:

def scan_qrcode(img_path):
 qrcode = cv2.imread(img_path)
 data = pyzbar.decode(qrcode)
 return data[0].data.decode('utf-8')

接下来我们再看看如何调用摄像头。

四、调用摄像头

在opencv中提供了一个VideoCapture类用于读取视频,同样可以用来调用摄像头。调用摄像头的步骤如下:

  • 调用摄像头
  • 循环
  • 在循环内读取一帧画面
  • 显示当前读取的画面
  • 等待键盘输入
  • 判断是否按退出键q
  • 按了推出键则退出,没按则继续循环

具体代码如下:

import cv2
# 调用摄像头
cap = cv2.VideoCapture(0)
while True:
 # 读取一帧画面
 ret, frame = cap.read()
 # 显示当前帧
 cv2.imshow('scan qrcode', frame)
 # 等待键盘输入
 key = cv2.waitKey(10)
 # 当按下q键时关闭摄像头
 if key == ord('q'):
  break
# 销毁所有窗口
cv2.destroyAllWindows()

你们可以自己尝试运行一下上面的代码,效果就像是打开了自己的前置摄像头。

现在调用了摄像头,我们可以把两部分的代码结合起来。

五、实现扫码工具

我们扫码工具的主体部分是调用摄像头的操作,我们需要对读取到的每一帧画面进行解析,当解析出结果后输出并退出。具体代码如下:

import cv2
from pyzbar import pyzbar

def scan_qrcode(qrcode):
 data = pyzbar.decode(qrcode)
 return data[0].data.decode('utf-8')

cap = cv2.VideoCapture(0)
while True:
 ret, frame = cap.read()
 cv2.imshow('scan qrcode', frame)

 # 解析二维码
 text = None
 try:
  text = scan_qrcode(frame)
 except Exception as e:
  pass
 if text:
  print(text)
  break

 key = cv2.waitKey(10)
 if key == ord('q'):
  break
cv2.destroyAllWindows()

上面我们把scan_qrcode函数修改了一下,从原来的传入图片路径到直接传入图片对象。因为通过VideoCapture对象获取的图片帧和通过cv2.imread获取的图片是同一数据类型。

上面关键步骤在解析二维码的操作。首先定义一个text,因为解析过程中如果没有二维码会出现异常,所以用try-except语句处理。如何通过if判断text的内容,只有当我们真正解析到了数据,程序才会输出结果,并退出程序。

到此这篇关于Python实现扫码工具的文章就介绍到这了,更多相关python扫码工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python字符和字符值(ASCII或Unicode码值)转换方法
May 21 Python
Django中模型Model添加JSON类型字段的方法
Jun 17 Python
python检查字符串是否是正确ISBN的方法
Jul 11 Python
详细解读Python中解析XML数据的方法
Oct 15 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
python中format()函数的简单使用教程
Mar 14 Python
python实现简单多人聊天室
Dec 11 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python3爬虫关于代理池的维护详解
Jul 30 Python
如何完美的建立一个python项目
Oct 09 #Python
python实现移动木板小游戏
Oct 09 #Python
详解Python中Pyyaml模块的使用
Oct 08 #Python
Python实现七个基本算法的实例代码
Oct 08 #Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 #Python
python自动化测试三部曲之unittest框架的实现
Oct 07 #Python
浅谈anaconda python 版本对应关系
Oct 07 #Python
You might like
浅析is_writable的php实现
2013/06/18 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
Python操作mongodb的9个步骤
2018/06/04 Python
python中for用来遍历range函数的方法
2018/06/08 Python
python实现图片插入文字
2019/11/26 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
美国著名的团购网站:Woot
2016/08/02 全球购物
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
个人担保书范文
2014/05/20 职场文书
法定代表人授权委托书
2014/09/19 职场文书
英文升职感谢信
2015/01/23 职场文书
2015学校年度工作总结
2015/05/11 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
高三毕业感言
2015/07/30 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js