当前位置: 首页 > news >正文

【python】OpenCV—QR Code

在这里插入图片描述

文章目录

  • 1 QR Code
  • 2 准备工作
  • 3 生成 QR 码
  • 4 读取 QR 码
  • 5 与 Zbar 比较

1 QR Code

QR Code(Quick Response Code)是一种二维条码,由日本Denso-Wave公司于1994年发明。QR Code的主要特点是存储信息量大、编码范围广、容错能力强、识读速度快,并且支持全方位识读。这种条码最初是为了在汽车制造行业快速追踪零部件而设计的,但现在已经广泛应用于各种领域,如移动支付、产品防伪、广告宣传、物流追踪等。

QR Code的构成:

  • 定位图案:位于二维码的左上角、右上角和左下角,用于确定二维码的角度和位置。
  • 校正图案:在二维码中有多个校正图案,用于在二维码发生形变时帮助解码器校正。
  • 格式信息:包含有关错误检测和校正的信息,以及使用的掩码版本。
  • 版本信息:表明QR Code的版本号,版本号越高,可以存储的信息越多,但QR Code的尺寸也越大。
  • 数据和纠错码:存储实际的信息和用于错误检测和校正的冗余数据。

QR Code的使用:

  • 移动支付:通过手机扫描QR Code进行快速支付。
  • 社交媒体:扫描QR Code可以直接跳转到某个社交媒体页面或添加好友。
  • 产品防伪:在产品包装上打印QR Code,消费者可以扫描验证产品的真伪。
  • 广告宣传:在广告中打印QR Code,观众可以通过扫描直接访问相关网站或获取更多信息。
  • 物流追踪:在物流包裹上打印QR Code,可以方便地进行物流追踪和查询。

QR Code的生成和扫描通常需要使用专门的软件或应用,这些软件和应用可以在各种平台上找到,如手机、电脑等。

2 准备工作

OpenCV基础(22)使用OpenCV生成及读取二维码以及与Zbar比较

pip install qrcode
pip install  pillow
pip install  pyzbar
pip install zbar

3 生成 QR 码

generateQRCode.py

#!/usr/bin/python3
# -*- encoding: utf-8 -*-
"""
@File    : generateQRCode.py
@Time    : 2021/10/12 14:13
@Author  : David
@Software: PyCharm
"""# 生成二维码
import qrcode# 二维码包含的示例数据
data = "https://blog.csdn.net/bryant_meng"
# 生成的二维码图片名称
filename = "CSDNBlog.png"
# 生成二维码
img = qrcode.make(data)
# 保存成图片输出
img.save(filename)

生成本博客主页的二维码

在这里插入图片描述

4 读取 QR 码

qrCodeOpencv.py

import cv2
import numpy as np
import sys
import timeif len(sys.argv) > 1:inputImage = cv2.imread(sys.argv[1])
else:inputImage = cv2.imread("CSDNBlog.png")# inputImage = cv2.imread("qrcode-learnopencv.jpg")# Display barcode and QR code location
def display(im, bbox):cv2.line(im, tuple(bbox[0]), tuple(bbox[1]), (255, 0, 0), 5)cv2.line(im, tuple(bbox[1]), tuple(bbox[2]), (255, 0, 0), 5)cv2.line(im, tuple(bbox[2]), tuple(bbox[3]), (255, 0, 0), 5)cv2.line(im, tuple(bbox[3]), tuple(bbox[0]), (255, 0, 0), 5)# Write resultscv2.imwrite("Results.jpg", im)# Display resultscv2.imshow("Results", im)# Create a qrCodeDetector Object
qrDecoder = cv2.QRCodeDetector()# Detect and decode the qrcode
t = time.time()
data, bbox, rectifiedImage = qrDecoder.detectAndDecode(inputImage)
print("Time Taken for Detect and Decode : {:.3f} seconds".format(time.time() - t))
if len(data) > 0:print("Decoded Data : {}".format(data))display(inputImage, np.array(bbox[0], dtype=np.int32))rectifiedImage = np.uint8(rectifiedImage)cv2.imwrite("Rectified_QRCode.jpg", rectifiedImage)cv2.imshow("Rectified QRCode", rectifiedImage)
else:print("QR Code not detected")cv2.imshow("Results", inputImage)
cv2.imwrite("output.jpg", inputImage)
cv2.waitKey(0)
cv2.destroyAllWindows()

生成 Results.jpg

在这里插入图片描述

Recitified_QRCode.jpg

在这里插入图片描述

5 与 Zbar 比较

import cv2
import numpy as np
import sys
import time
import pyzbar.pyzbar as pyzbarcap = cv2.VideoCapture("qr-code_animated.gif")
hasFrame, frame = cap.read()
vid_writer = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10,(frame.shape[1], frame.shape[0]))# Display barcode and QR code location
def display(im, decodedObjects):# Loop over all decoded objectsfor decodedObject in decodedObjects:points = decodedObject.polygon# If the points do not form a quad, find convex hullif len(points) > 4:hull = cv2.convexHull(np.array([point for point in points], dtype=np.float32))hull = list(map(tuple, np.squeeze(hull)))else:hull = points;# Number of points in the convex hulln = len(hull)# Draw the convext hullfor j in range(0, n):cv2.line(im, hull[j], hull[(j + 1) % n], (255, 0, 0), 3)# Display results# cv2.imshow("Results", im);# Create a qrCodeDetector Object
qrDecoder = cv2.QRCodeDetector()# Detect and decode the qrcode
t = time.time()
while (1):hasFrame, inputImage = cap.read()if not hasFrame:breakdecodedObjects = pyzbar.decode(inputImage)if len(decodedObjects):zbarData = decodedObjects[0].dataelse:zbarData = ''opencvData, bbox, rectifiedImage = qrDecoder.detectAndDecode(inputImage)if zbarData:cv2.putText(inputImage, "ZBAR : {}".format(zbarData.decode()), (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1,(0, 255, 0), 2, cv2.LINE_AA)else:cv2.putText(inputImage, "ZBAR : QR Code NOT Detected", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2,cv2.LINE_AA)if opencvData:cv2.putText(inputImage, "OpenCV:{}".format(opencvData), (10, 150), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2,cv2.LINE_AA)else:cv2.putText(inputImage, "OpenCV:QR Code NOT Detected", (10, 150), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2,cv2.LINE_AA)display(inputImage, decodedObjects)cv2.imshow("Result", inputImage)vid_writer.write(inputImage)k = cv2.waitKey(20)if k == 27:break
cv2.destroyAllWindows()
vid_writer.release()

输入

在这里插入图片描述

输出为视频,我们转化成 gif

在这里插入图片描述
可以看出 qrcode 库没有 pyzbar 库检测结果稳定

相关文章:

  • jenkins部署和使用
  • IT行业入门,如何假期逆袭,实现抢跑
  • 基于redisson实现tomcat集群session共享
  • 几种linux开机自启脚本的方法
  • c语言回顾-数组(全网最详细,哈哈哈)
  • Vue 3中 <script setup> 与生命周期钩子函数的详细解析
  • 软考-软件设计师
  • 海云安参编《数字安全蓝皮书 》正式发布并入选《2024中国数字安全新质百强》荣膺“先行者”
  • 深⼊理解MySQL Innodb存储引擎的缓冲池、事务、索引底层工作原理,掌握 MySQL 主从同步,读写分离技术以及集群的搭建,具备分库分表,SQL调优经验
  • Objective-C使用块枚举的细节
  • 如何构建智能聊天系统
  • Zigbee智能家居数据中心:微信小程序实时掌控家居传感器信息
  • Java面试题-锁
  • 【前端项目笔记】7 商品管理
  • 玩转springboot之springboot扩展SpringMVC
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • __proto__ 和 prototype的关系
  • HTTP--网络协议分层,http历史(二)
  • MobX
  • Object.assign方法不能实现深复制
  • React-flux杂记
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 不上全站https的网站你们就等着被恶心死吧
  • 从重复到重用
  • 构建工具 - 收藏集 - 掘金
  • 驱动程序原理
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 正则表达式小结
  • 组复制官方翻译九、Group Replication Technical Details
  • ​2020 年大前端技术趋势解读
  • # 达梦数据库知识点
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (PADS学习)第二章:原理图绘制 第一部分
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)计算机毕业设计ssm电影分享网站
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)为C# Windows服务添加安装程序
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net快速开发框架源码分享
  • .net中的Queue和Stack
  • @Mapper作用
  • @Validated和@Valid校验参数区别
  • [ C++ ] STL---string类的模拟实现
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android]使用Git将项目提交到GitHub
  • [BZOJ3757] 苹果树
  • [C++]四种方式求解最大子序列求和问题
  • [CDOJ 1343] 卿学姐失恋了