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的Django框架中的缓存控制
Jul 24 Python
python 换位密码算法的实例详解
Jul 19 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
Nov 25 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
Python爬虫开发与项目实战
Dec 16 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
python实现简易名片管理系统
Apr 11 Python
手残删除python之后的补救方法
Jun 26 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
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
python实现手机销售管理系统
2019/03/19 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
Django时区详解
2019/07/24 Python
django基于restframework的CBV封装详解
2019/08/08 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
迪奥官网:Dior.com
2018/12/04 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
班主任工作年限证明
2014/01/12 职场文书
特岗教师个人总结
2015/02/10 职场文书
小学生安全保证书
2015/05/09 职场文书
Mysql数据库命令大全
2021/05/26 MySQL
索尼ICF-5900W收音机测评
2022/04/24 无线电