Python实现的扫码工具居然这么好用!


Posted in Python onJune 07, 2021

一、案例分析

我们先思考一下,实现扫码工具需要写什么操作。在扫码过程中我们需要打开摄像头,如何由手机或者电脑识别二维码。所以我们要实现两个关键的步骤:调用摄像头、识别二维码。
这两个操作分别对应了两个模块,它们就是opencvpyzbar,其中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模块后,我们识别二维码的工作就非常简单了,首先需要准备一张二维码。有了二维码后就可以开始解析了,具体步骤如下:

1.读取二维码图片

2.解析二维码中的数据

3.在解析出的数据中提取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类用于读取视频,同样可以用来调用摄像头。调用摄像头的步骤如下:

1.调用摄像头

2.循环

3.在循环内读取一帧画面

4.显示当前读取的画面

5.等待键盘输入

6.判断是否按退出键q

7.按了推出键则退出,没按则继续循环

具体代码如下:

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,因为解析过程中如果没有二维码会出现异常,所以用语句处理。如何通过if判断text的内容,只有当我们真正解析到了数据,程序才会输出结果,并退出程序。

到这里,我们就实现了扫码工具。

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

Python 相关文章推荐
Python实现扩展内置类型的方法分析
Oct 16 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
python基础教程项目三之万能的XML
Apr 02 Python
python xlsxwriter创建excel图表的方法
Jun 11 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
浅谈Python描述数据结构之KMP篇
Sep 06 Python
Python中Yield的基本用法
Oct 18 Python
忆童年!用Python实现愤怒的小鸟游戏
python单元测试之pytest的使用
Jun 07 #Python
Python趣味实战之手把手教你实现举牌小人生成器
怎么用Python识别手势数字
利用python调用摄像头的实例分析
Jun 07 #Python
python通过opencv调用摄像头操作实例分析
Jun 07 #Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 #Python
You might like
网络资源
2006/10/09 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
laravel学习教程之存取器
2016/07/30 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python SQLite3数据库操作类分享
2014/06/10 Python
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
Python下载网络小说实例代码
2018/02/03 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
python列表推导式入门学习解析
2019/12/02 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
python如何代码集体右移
2020/07/20 Python
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
打架检讨书300字
2014/02/02 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
迟到检讨书范文
2015/01/27 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
企业愿景口号
2015/12/25 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
Oracle用户管理及赋权
2022/04/24 Oracle
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers