【python】OpenCV—QR Code

news2025/1/10 1:27:57

在这里插入图片描述

文章目录

  • 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 time

if 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 results
    cv2.imwrite("Results.jpg", im)

    # Display results
    cv2.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 pyzbar

cap = 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 objects
    for decodedObject in decodedObjects:
        points = decodedObject.polygon

        # If the points do not form a quad, find convex hull
        if 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 hull
        n = len(hull)

        # Draw the convext hull
        for 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:
        break
    decodedObjects = pyzbar.decode(inputImage)
    if len(decodedObjects):
        zbarData = decodedObjects[0].data
    else:
        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.coloradmin.cn/o/1876199.html

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

相关文章

如何让ubuntu开机自动启动DHCP呢?

在Ubuntu系统中,确保DHCP服务(通常是ISC DHCP服务)在系统启动时自动运行,需要进行以下几步操作: ### 1. 确保DHCP服务已安装 如果你还没有安装DHCP服务,可以使用下面的命令进行安装: bash sudo…

TCP:TCP连接的建立与终止

TCP连接的建立与终止 建立连接第一次握手第二次握手第三次握手 终止连接第一次挥手第二次挥手第三次挥手TIME_WAIT 状态 第四次挥手 连接建立超时 T C P是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本文将详细讨论一个T…

文心一言用户达3亿!文心大模型4.0 Turbo发布,支持API,真GPT-4 Turbo国产来了!

文心一言用户规模达到3亿了! 这是笔者在今天的百度Wave Summit 2024大会上的看到的数字。需要强调的是,文心一言的用户规模是在去年12月破亿的。这意味着,仅仅隔了6个月,文心一言用户数量在亿这个级别的数字上竟然直接翻了三倍。…

2024最出色的代理软件评估及推荐

随着网络技术的飞速发展,代理软件已成为许多网络活动不可或缺的工具,特别是在数据抓取、网络安全防护等方面。在众多代理软件中,哪些能真正满足用户需求,提供卓越的性能和服务呢?我们的测评团队经过深入研究和测试&…

Reid系列论文学习——无人机场景下基于 Transformer 的轻量化行人重识别

今天介绍的一篇论文是针对无人机场景下的行人重识别,论文题目为:"无人机场景下基于 Transformer 的轻量化行人重识别"。该论文针对无人机场景下行人呈现多角度多尺度的特点、以及传统CNN网络在行人重识别任务中受限于感受野和下采样导致的无法…

Go-知识测试-单元测试

Go-知识测试-单元测试 1. 定义2. 使用3. testing.common 测试基础数据4. testing.TB 接口5. 单元测试的原理5.1 context 单元测试的调度5.1.1 等待并发执行 testContext.waitParallel5.1.2 并发测试结束 testContext.release 5.2 测试执行 tRunner5.3 启动测试 Run5.4 启动并发…

《晨集》开源软件平台的创新与发展

一、引言 在数字化浪潮的推动下,开源软件平台已成为推动软件创新、促进知识共享的重要力量。《晨集》作为新兴的开源软件平台,其上线标志着开源生态圈的又一重要里程碑。本文旨在探讨《晨集》开源软件平台的创新特点、对开发者社区的影响以及未来发展趋…

Flink作业执行之 4.JobGraph

Flink作业执行之 4.JobGraph 1. 入口 前文了解了由Transformation到StreamGraph的过程,StreamGraph即作业的逻辑拓扑结构。 生成逻辑结构后,接下来的操作往往是对逻辑结构的优化。在很多组件中都是这样的处理,如hive、spark等都会执行“逻辑…

【linux】从零到入门

linux概述 Linux是一个免费使用和自由传播的一套操作系统。用户可以无偿地得到它地源代码,和大量地应用程序,并且可以随意修改和增加它们。 Linux的内核起初由林纳斯编写。内核是啥? 驱动设备,文件系统,进程管理&…

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法? 需求:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能 短连接风暴 短连接模式:执行很少的 SQL 语句就断开,…

【Sklearn-驯化】一文搞懂机器学习树模型建模可视化过程

【Sklearn-驯化】一文搞懂机器学习树模型建模可视化过程 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内容文档关注&#xff…

LeetCode刷题之HOT100之数组中的第K个最大元素

2024 6/29 今天天气很好啊,想爬山,奈何下午还有最后的一个汇报。做个题先 1、题目描述 2、算法分析 看到这个题我想到的就是: public int findKthLargest(int[] nums, int k) {Arrays.sort(nums);return nums[nums.length - k ];}哈哈,我提…

计算机网络 —— 基本概念

基本概念 1. 通信协议2. 面向连接 v.s. 面向无连接3. 电路交换 v.s. 分组交换4. 单工通信 v.s. 双工通信 1. 通信协议 通信协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU 以及不同的操作系统组成的计算…

记录一下MATLAB优化器出现的问题和解决

今天MATLAB优化器出了点问题。我想了想,决定解决一下,不然后面项目没有办法进行下去。 我忘了截图了。 具体来说,是出现了下面的问题。 Gurobi: Cplex: 在上次为了强化学习调整了Pytoch环境以后(不知道是不是这个原因&#…

background 与 background-image

相同点:background 与 background-image都可以用于设置背景图 区别. background既可以用于设置背景图, 又可以用于设置CSS样式,还可以用于设置背景属性。 background-image只能用于设置背景图 background能设置的背景属性,如下&…

绝了!Stable Diffusion做AI治愈图片视频,用来做副业简直无敌!10分钟做一个爆款视频保姆教程

一 项目分析 这个治愈类视频的玩法是通过AI生成日常生活场景,制作的vlog,有这样的一个号,发布了几条作品,就涨粉了2000多,点赞7000多,非常的受欢迎。 下面给大家看下这种作品是什么样的,如图所…

大语言模型LLM基础:推理/不同模型/量化对显存、推理速度和性能的影响

通过本文,你将了解以下几个方面的内容: 要运行一个LLM需要多少显存?(我的GPU可以运行多大LLM?)不同LLM推理速度如何?量化对显存、推理速度和性能的影响?vLLM、DeepSeed等工具的加速…

智慧校园-档案管理系统总体概述

智慧校园档案管理系统,作为教育信息化进程中的重要一环,它运用现代信息技术的力量,彻底改变了传统档案管理的面貌,为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…

Rocky Linux设置静态IP

[connection] idens160 uuidcd246f67-c929-362a-809d-f1b44ddc5d25 typeethernet autoconnect-priority-999 interface-nameens160 timestamp1719094243[ethernet][ipv4] ## 在IPV4下面修改如下内容 methodmanual address192.…

常见的反爬手段和解决思路(爬虫与反爬虫)

常见的反爬手段和解决思路(爬虫与反爬虫) 学习目标1 服务器反爬的原因2 服务器长反什么样的爬虫(1)十分低级的应届毕业生(2)十分低级的创业小公司(3)不小心写错了没人去停止的失控小…