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

作者:不想秃头的晨晨 时间:2022-12-13 19:54:03 

一、案例分析

我们先思考一下,实现扫码工具需要写什么操作。在扫码过程中我们需要打开摄像头,如何由手机或者电脑识别二维码。所以我们要实现两个关键的步骤:调用摄像头、识别二维码。
这两个操作分别对应了两个模块,它们就是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的内容,只有当我们真正解析到了数据,程序才会输出结果,并退出程序。

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

来源:https://blog.csdn.net/chenchen5152/article/details/117520433

标签:Python,扫码,工具
0
投稿

猜你喜欢

  • Python实现微信中找回好友、群聊用户撤回的消息功能示例

    2022-02-04 02:51:02
  • Vue组件的通信方式详解

    2024-04-26 17:39:23
  • 使用Python生成XML的方法实例

    2022-10-01 19:20:15
  • Python3单行定义多个变量或赋值方法

    2022-03-22 17:10:53
  • PHP源码之 ext/mysql扩展部分

    2023-07-21 18:24:20
  • 详解vue页面首次加载缓慢原因及解决方案

    2024-05-25 15:19:45
  • CSS制作滑动折叠的文字效果

    2008-12-01 13:10:00
  • mysql中全连接full join...on...的用法说明

    2024-01-13 19:44:22
  • vue实现动态控制el-table表格列的展示与隐藏

    2024-05-05 09:07:26
  • Sql Server2005对现有数据进行分区具体步骤

    2008-06-26 13:18:00
  • Python对象与引用的介绍

    2023-04-30 12:51:59
  • tween.js缓动补间动画算法示例

    2024-05-21 10:13:40
  • anconda的pip下载包出现的问题解决

    2022-06-21 22:17:33
  • Python使用回溯法子集树模板解决迷宫问题示例

    2021-07-09 14:42:43
  • SQL汇总统计与GROUP BY过滤查询实现

    2024-01-22 20:21:43
  • golang指数运算操作

    2024-01-30 22:35:53
  • python实现web方式logview的方法

    2023-12-23 17:07:54
  • 月影:JavaScript王者归来

    2008-08-05 17:18:00
  • SPSS连接mysql数据库的超详细操作教程

    2024-01-21 13:49:25
  • Dreamweaver4探谜系列(2)

    2010-05-13 12:08:00
  • asp之家 网络编程 m.aspxhome.com