opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

news2024/11/19 22:52:11

1.二维码的生成

废话不多说,直接上代码

# 生成二维码
import qrcode

# 二维码包含的示例数据
data = "B0018"
# 生成的二维码图片名称
filename = "qrcode.png"
# 生成二维码
img = qrcode.make(data)
# 保存成图片输出
img.save(filename)

img.show()

运行效果:

会在当前目前生成一张图片
在这里插入图片描述

对生成的二维码识别

opencv从4代之后推出了二维码识别接口.调用方法是这样的.代码如下:

import cv2

img = cv2.imread('qrcode.png')
qrcode = cv2.QRCodeDetector()
result, points, code = qrcode.detectAndDecode(img)

print(result)

运行结果:

B0018

返回值有三个,

  • 第一个result就是解码后的内容,例如我这个二维码的结果是"B0018",当然也可以是个纯数字.

  • 第二个points是二维码轮廓的四个角,从左上角顺时针转的.

  • 第三个code是二维码的原始排列,也就是每个点是0还是255的一个矩阵.白色是255,黑色是0.调用起来十分方便,而且如果不需要解码,只是想定位的话可以调用detect函数,返回结果就只有四个角点了.

如果是一个大图中的一个二维码识别呢?比如下面的这个图
在这里插入图片描述

如果继续使用上面的识别二维码是识别不出来的。

下面我们看下二维码的原理及定位原理

二维码的结构与基本原理

标准的二维码结构如下:

在这里插入图片描述
特别要关注的是图中三个黑色正方形区域,它们就是用来定位一个二维码的最重要的三个区域,我们二维码扫描与检测首先要做的就是要发现这三个区域,如果找到这个三个区域,我们就成功的发现一个二维码了,就可以对它定位与识别了。

二维码其它各个部分的说明如下:

在这里插入图片描述
三个角上的正方形区域从左到右,从上到下黑白比例为1:1:3:1:1。

在这里插入图片描述
不管角度如何变化,这个是最显著的特征,通过这个特征我们就可以实现二维码扫描检测与定位。

除了上面的qrcode 包可以识别二维码外,还有pyzbar 包 也可以进行二维码的识别。比对下pyzbar 比qrcode 包的效率 更高。下面的代码

import cv2
import numpy as np
import time
import pyzbar.pyzbar as pyzbar

# 显示条码和二维码位置
def display(im, decodedObjects):
    # 遍历所有已解码的对象
    for decodedObject in decodedObjects:
        points = decodedObject.polygon

        # 如果点不形成四边形,请找到凸包
        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;
        # 凸包中的点数
        n = len(hull)
        # 绘制凸包
        for j in range(0, n):
            cv2.line(im, hull[j], hull[(j + 1) % n], (255, 0, 0), 3)
# 创建一个 qrCodeDetector 对象
qrDecoder = cv2.QRCodeDetector()

# 检测和解码二维码
t = time.time()
inputImage = cv2.imread("66.jpg")

decodedObjects = pyzbar.decode(inputImage)
if len(decodedObjects):
    zbarData = decodedObjects[0].data
else:
    zbarData = ''


if zbarData:
    cv2.putText(inputImage, "result : {}".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)

display(inputImage, decodedObjects)

print("Time Taken for Detect and Decode : {:.3f} seconds".format(time.time() - t))
cv2.imshow("Result", inputImage)
cv2.waitKey(0)
cv2.destroyAllWindows()





运行效果:

在这里插入图片描述

从结果中可以看出可以定位到二维码的位置并将 识别的结果显示在左上角。

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

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

相关文章

Windows操作系统打开Sketch文件的实用技巧!

在设计工作中,Sketch是一款非常受欢迎的矢量绘图软件,但由于它只能兼容Mac操作系统,对设计师有一定的局限性,Sketch的使用问题就成了困扰。今天本文将为大家分享一个在Windows系统也能打开Sketch文件的操作方法,一起来…

大模型+学习机,是概念游戏还是双向奔赴?

众所周知,2023年上半年大模型概念炙手可热。各大科技公司纷纷卷入,或宣称布局相关领域,或率先官宣自研大模型。而随着资本市场对大模型概念的热情有所消退,属于这片战场的新一轮角逐慢慢聚焦在了技术的落地应用上。 8月15日&#…

【学习FreeRTOS】第13章——FreeRTOS队列

1.队列简介 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递) FreeRTOS基于队列, 实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二值信号量、 递归互斥信号量,因此很有必要深入了…

手把手教你部署Jenkins教程,小白也能学会(多图预警)!

背景 公司的前端、后端构建及部署工作都是人工去做,随着业务扩大,项目迭代速度变快,人员增多,各种问题都暴露出来,将通过一个简单案例分享一下基于Jenkins的前后端自动化工作流搭建的过程,搭建完这套工作流…

做好客户服务的方法五部曲!

在每个商业领域中,提供优质的客户服务是成功的一个关键因素。无论企业的规模大小如何,都需要始终坚守为客户提供长期高质量服务的原则,以赢得客户信任与忠诚。今天,就让我们进一步探讨一下,客户服务有哪些方法技巧&…

快速学习制作数据查询系统的方法

无论是老师、企业还是机构,都会有信息查询的需求。例如,老师可能需要制作一个成绩查询、等级查询、分宿舍分寝室查询、分班查询、录取情况查询、新生报名查询等系统,让学生家长可以自行查询。 同样地,企业或机构也希望制作工资条查…

规划 2023 年拥有实体店的 DTC 品牌的发展方向

2023 年,DTC 品牌应谨慎考虑扩张实体店,以此作为扩大影响力和服务客户群的另一种方式。只有当企业在数字领域取得一定程度的成功,并且拥有适当管理数字和实体店的资源时,才应该进行这种扩张。这里的前提是,如果生意不好…

DockerCompose介绍与使用

DockerCompose介绍与使用 1、DockerCompose介绍 DockerCompose用于定义和运行多容器 Docker 应用程序的工具。 通过 Compose可以使用 YAML 文件来配置应用程序需要的所有服务。一个使用Docker容器的应用,通常由多个容器组成,使用Docker Compose不再需要…

C语言易错点整理

前言: 本文涵盖了博主在平常写C语言题目时经常犯的一些错误,在这里帮大家整理出来,一些易错点会帮大家标识出来,希望大家看完这篇文章后有所得,引以为戒~ 一、 题目: 解答: 首先在这个程序中…

动捕设备助力打造沉浸式虚拟现实体验

在纪录片《超时空寻找》中,借助了实时动捕设备,基于三维数字人技术进行老战士与历史场景还原,让抗美援朝老战士可以通过虚拟现实技术,跨越时空与战友实现隔空对话。 随着动捕设备的不断发展,虚拟现实技术越来越成熟&a…

clickhouse ssb-dbgen数据构造 及 clickhouse-benchmark简单压测

一、 测试数据构造 1. 数据样例 官方文档有给出一批数据样例。优点是比较真实,缺点是太大了,动辄上百G不适合简单小测试 Anonymized Yandex.Metrica DatasetStar Schema BenchmarkWikiStatTerabyte of Click Logs from CriteoAMPLab Big Data Benchma…

超实用的小红书种草方案分享!纯干货

小红书以“生活、时尚、美妆”等主题内容吸引了大量用户,成为了品牌方的种草宝地。那么,如何在小红书上打造爆款内容,吸引万千粉丝呢?本文伯乐网络传媒将从独特的角度深度剖析小红书种草方案,为你提供新知。 制定小红书…

SEMIDRIVE X9U 插入 USB 不识别调试要点

一、前言 客户用芯驰 X9U 平台做的智能座舱产品,在烧写固件时发现,通过 USB 连接到 SSA 的 USB 接口,Windows 上无法识别出 USB 设备,一直处在 Ready 状态。 二、SEMIDRIVE X9U 插入 USB 不识别调试要点 ① 建议客户测量 SoC 的…

PDF校对:让您的文件无瑕疵

无论您是企业家、学生、教育者还是作家,我们都知道,提交或发布一个充满错误的PDF文件可能会给您的声誉或品牌带来严重损害。这就是为什么PDF校对如此关键的原因。现在,让我们深入了解PDF校对的重要性,以及如何确保您的文件尽可能完…

RabbitMQ默认监听的ip地址

RabbitMQ 默认监听所有可用 ip 地址,当Rabbitmq 所在的服务端节点上存在多 ip 时,只要客户端能与服务端任一 ip 通信,即可向 RabbitMQ 发送消息

黑马 小兔鲜儿 uniapp 小程序开发- 02首页模块

黑马 小兔鲜儿 uniapp 小程序开发- 01项目起步_软工菜鸡的博客-CSDN博客 本课程是全网首套用 vue3 加 TS 写的 uniapp 项目, 里面大量封装自己的组件库,课程从 uni-app 基础入手,按照9大电商业务模块逐步实现完整的电商购物流程业务&#xff…

【LeetCode-中等题】73. 矩阵置零

题目 题解一&#xff1a;使用标记数组 public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;boolean[] row new boolean[m];boolean[] col new boolean[n];for(int i0; i< m;i){for(int j 0;j<n;j){if (matrix[i][j] 0) row[i]col…

【SQL中DDL DML DQL DCL所包含的命令】

SQL中DDL DML DQL DCL所包含的命令 关于DDL、DML、DQL、DCL的定义和适用范围如下&#xff1a; 数据定义语言&#xff08;Data Definition Language&#xff0c;DDL&#xff09;&#xff1a; DDL用于创建、修改和删除数据库中的表、视图、索引等对象。它的主要命令包括CREATE、A…

230814期优橙5G网络优化就业班开班啦!这样的学习环境泰酷辣!~

230814期为期8天的基础班顺利结束&#xff01; 接下来就是为期3个月的就业班 小优橙一点都不敢耽搁时间 紧跟优橙老师教学节奏 今日通知 230814期优橙就业班今天已经正式开班&#xff01; 本次就业班有哪些新收获&#xff01; 快来跟着学员视角看看8天在优橙真实感受吧~…