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的Flask框架中使用日期和时间的教程
Apr 21 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
解决Mac安装scrapy失败的问题
Jun 13 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
Aug 01 Python
浅谈Python __init__.py的作用
Oct 28 Python
python 列表推导和生成器表达式的使用
Feb 01 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 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面试题 试试看看你会不会也中招
2014/08/19 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
Python中方法链的使用方法
2016/02/23 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
应用化学专业本科生求职信
2013/09/29 职场文书
口腔医学技术应届生求职信
2013/11/09 职场文书
安全技术说明书
2014/05/09 职场文书
同意落户证明
2015/06/19 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python