二维码作为一种信息传递的工具,在当今社会发挥了重要作用。从手机用户登录到手机支付,生活的各个角落都能看到二维码的存在。那你知道二维码是怎么解析的吗?有想过自己实现一个扫码工具吗?如果想的话就继续看下去吧!
一、案例分析
我们先思考一下,实现扫码工具需要写什么操作。在扫码过程中我们需要打开摄像头,如何由手机或者电脑识别二维码。所以我们要实现两个关键的步骤:调用摄像头、识别二维码。
这两个操作分别对应了两个模块,它们就是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的内容,只有当我们真正解析到了数据,程序才会输出结果,并退出程序。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 《暗喻幻想》顺风耳作用介绍
- 崔健1985-梦中的倾诉[再版][WAV+CUE]
- 黄子馨《追星Xin的恋人们2》HQ头版限量编号[WAV+CUE]
- 孟庭苇《情人的眼泪》开盘母带[低速原抓WAV+CUE]
- 孙露《谁为我停留HQCD》[低速原抓WAV+CUE][1.1G]
- 孙悦《时光音乐会》纯银CD[低速原抓WAV+CUE][1.1G]
- 任然《渐晚》[FLAC/分轨][72.32MB]
- 英雄联盟新英雄安蓓萨上线了吗 新英雄安蓓萨技能介绍
- 魔兽世界奥杜尔竞速赛什么时候开启 奥杜尔竞速赛开启时间介绍
- 无畏契约CGRS准星代码多少 CGRS准星代码分享一览
- 张靓颖.2012-倾听【少城时代】【WAV+CUE】
- 游鸿明.1999-五月的雪【大宇国际】【WAV+CUE】
- 曹方.2005-遇见我【钛友文化】【WAV+CUE】
- Unity6引擎上线:稳定性提升、CPU性能最高提升4倍
- 人皇Sky今日举行婚礼!电竞传奇步入新篇章