【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 库检测结果稳定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++编程逻辑讲解step by step:字符串的查找和替换

题目 word中有查找和替换功能,编程实现在一个字符串中进行查找和替换的功能。 分析 题目不允许使用另外数组,要求在原数组上进行替换;需要不断地移动字符串,或者增长或者缩短,初始数组必须足够大。 代码 #include &l…

基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PI控制的三相整流器控制系统的simulink建模与仿真,用MATLAB自带的PMSM电机设为发电机,输入为转速,后面接一个可以调节电流的三相整流器&#xff0c…

three.js地理坐标系有哪些,和屏幕坐标系的转换。

坐标系很好理解,就是点线面体的位置,一个点是一个坐标,一条线段2个坐标,一个矩形四个坐标,一个立方体8个坐标,three.js面对的是三维空间,屏幕则是二维的,这就面临着转换问题&#xf…

数字化精益生产系统--SRM供应商关系管理

SRM供应商关系管理,全称为Supplier Relationship Management(供应商关系管理)系统,是一种专门用于管理采购供应链和供应商关系的软件系统。该系统通过集成各个环节的采购活动,帮助企业实现采购流程的自动化、标准化和优…

GY-30光照传感器软件I2C方式驱动代码,基于STM32Cube

GY-30光照传感器的具体资料可以去淘宝搜索然后问卖家要,网上也有,所以这里我就不多嘴了。 VCC连接3到5伏电压,根据文件开头的描述在STM32CubeMX中配置好外设。 STM32Cube开发方式就是4个字“简单直接”,直接上代码。 gy30.h #…

hive的表操作

常用的hive命令 切换数据库use test;查询表的建表信息show create table 数据库名称.表名;查看表的类型信息desc formatted 数据库名称.表名; 删除内部表 drop table 数据库名称.表名; 先启动hdfs ,mysql , hiveservice2,beeline CREATE [EX…

模拟QQ聊天界面遇到的问题:关于PyQt5 GUI模块不允许在多线程中进行操作的解决办法

简介 今天想要使用PyQt5结合Websocket实现一个小小的QQ聊天界面。 介绍一下我实现这个功能的具体思路:GUI界面运行起来后,创建一个线程去连接Websocket服务器,然后主界面类中实现了websocket的基本回调函数。比如,发送消息的回调…

持续部署的7个陷阱及其避免方法

什么是持续部署? 持续部署是一种软件开发实践,其中代码更改会自动部署到生产中,无需开发人员或运营团队的明确批准。这实现了从开发到部署的完全自动化流程,确保新功能、错误修复和更新能够快速提供给最终用户。通过将此流程集成…

Bioconda软件安装神器:多版本并存、环境复制、环境导出

Conda包管理系统 Conda是一种通用包管理系统,旨在构建和管理任何语言的任何类型的软件。通常与Anaconda (集成了更多软件包,https://www.anaconda.com/download/#download)和Miniconda(只包含基本功能软件包, https://conda.io/miniconda.html)一起分发…

Kubernetes (K8s) 底层原理

Kubernetes (K8s) 的底层原理涉及多个关键组件和概念,确保容器化应用程序的自动化部署、扩展和管理。以下是 Kubernetes 的底层原理及其关键组件的详细描述。 核心组件 Etcd 功能:分布式键值存储,用于存储集群的所有数据,包括配置…

昇思25天学习打卡营第9天|MindSpore-Vision Transformer图像分类

Vision Transformer图像分类 Vision Transformer(ViT)简介 近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩展性,它已经能够训练具有超过100B参数的空前…

【C++】运算符重载

目录 运算符重载加号运算符左移运算符递增运算符赋值运算符关系运算符函数调用运算符 运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 加号运算符 目标:实现两个对象相加或类和…

java面试之jvm常见面试题

1、JVM是什么?JVM的主要组成部分? JVM(Java Virtual Machine)是Java程序的执行环境,它使得Java程序能够“一次编写,到处运行”。JVM主要由以下部分组成: 1、类加载器(ClassLoader&…

MySQL篇-SQL优化实战

SQL优化措施 通过我们日常开发的经验可以整理出以下高效SQL的守则 表主键使用自增长bigint加适当的表索引,需要强关联字段建表时就加好索引,常见的有更新时间,单号等字段减少子查询,能用表关联的方式就不用子查询,可…

某Dota/IM的某电竞对战平台玩家助手、查看战绩、胜率等

功能说明 WAR3游戏启动后,可以自动获取游戏双方的玩家列表,然后查询显示玩家的战绩及个人信息。附带查看玩家的战绩详情、最近游戏,查看对手及友方的战绩详情,据此推算出是否开黑、是否小号等信息 使用方法及运行效果 启动 查…

腾讯地图异步调用

<template><!-- 定义地图显示容器 --><div id"container"></div> </template><script setup>import { onMounted } from vue;const mapKeys import.meta.env.VITE_GLOB_TX_MAP_KEYS;function initMap() {// //定义地图中心点坐…

【MySQL备份】mysqldump基础篇

目录 1.简介 2.基本用途 3.命令格式 3.1常用选项 3.2常用命令 4.备份脚本 5.定时执行备份脚本 1.简介 mysqldump 是 MySQL 数据库管理系统的命令行实用程序&#xff0c;用于创建数据库的逻辑备份。它能够导出数据库的结构&#xff08;如表结构、视图、触发器等&#xf…

【C++题解】1456. 淘淘捡西瓜

问题&#xff1a;1456. 淘淘捡西瓜 类型&#xff1a;贪心 题目描述&#xff1a; 地上有一排西瓜&#xff0c;每个西瓜都有自己的重量。淘淘有一个包&#xff0c;包的容量是固定的&#xff0c;淘淘希望尽可能在包里装更多的西瓜&#xff08;当然要装整个的&#xff0c;不能切开…

C#——异步Task详情

C#异步Task 异步&#xff1a;多任务开始执行&#xff0c;只需要主任务 A 执行完成就算结束&#xff0c;主任务执行的时候&#xff0c;可以同时执行异步任务 B、C&#xff0c;主任务 A 可以不需要等待异步任务 B、C 的结果。 在C#中&#xff0c;异步编程主要通过async和await关…

三维地图Cesium中,如何监听地图点击事件,实现在实体上面鼠标右击时做处理。

在 Cesium 中&#xff0c;如果你想在实体&#xff08;Entity&#xff09;上实现鼠标右击&#xff08;右键点击&#xff09;的处理&#xff0c;你需要使用 Cesium 的事件系统来监听鼠标事件&#xff0c;并结合一些逻辑来判断点击是否发生在实体上。由于 Cesium 没有直接提供“点…