社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python实现扫码工具

Crossin的编程教室 • 5 年前 • 433 次点击  


大家好,欢迎来到 Crossin的编程教室 !

二维码作为一种信息传递的工具,在当今社会发挥了重要作用。从手机用户登录到手机支付,生活的各个角落都能看到二维码的存在。那你知道二维码是怎么解析的吗?有想过自己实现一个扫码工具吗?今天我们就来给大家实例演示一下。

一、案例分析

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

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

二、环境

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

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

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

pip install opencv-python

然后是pyzbar模块:

pip install pyzbar

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


三、识别二维码

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

1.读取二维码图片2.解析二维码中的数据3.在解析出的数据中提取data信息

实现代码如下:

import cv2from 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.判断是否按退出键q7.按了退出键则退出,没按则继续循环

具体代码如下:

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 cv2from 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'): breakcv2.destroyAllWindows()

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

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

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

如果文章对你有帮助,欢迎转发/点赞/收藏~

作者:ZackSock
来源:新建文件夹X


_往期文章推荐_

一行代码制作个性化二维码




如需了解付费精品课程及 教学答疑服务
请在Crossin的编程教室内回复: 666

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/113656