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

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()





运行效果:

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据-玩转数据-Flink窗口

一、Flink 窗口 理解 在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击…

Java【手撕双指针】LeetCode 57. “两数之和“, 图文详解思路分析 + 代码

文章目录 前言一、两数之和1, 题目2, 思路分析3, 代码展示 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 📗 Java数据结构: 顺序表, 链表…

用好「留存」,闭环小程序运营链路

如何通过线上小程序获取用户线索,提高企业抗风险能力,建立有效的营销数字化系统一直是困扰每一个小程序开发者与运营者的问题。 当我们选择使用小程序设计自己的运营流程时,从「推广」到「转化」,再到最终的「留存」都是运营过程…

C语言(第三十三天)

3.1.2 画图推演 3.2 举例2:顺序打印一个整数的每一位 输入一个整数m,打印这个按照顺序打印整数的每一位。 比如: 输入:1234 输出:1 2 3 4 输入:520 输出:5 2 0 3.2.1 分析和代码实现 这个题目&a…

无涯教程-分类算法 - Python实现函数

为了在Python中实现SVM,无涯教程将从标准库导入开始,如下所示- import numpy as np import matplotlib.pyplot as plt from scipy import stats import seaborn as sns; sns.set() 接下来,从sklearn.dataset.sample_generator创建具有线性可…

WordPress使用子主题插件 Child Theme Wizard,即使主题升级也能够保留以前主题样式

修改WordPress网站样式,主题升级会导致自己定义设置的网站样式丢失,还需要重新设置,很繁琐工作量大,发现在WordPress 中有Child Theme Wizard子主题插件,使用Child Theme Wizard子主题插件,即使主题升级&am…

设计模式-桥接模式

核心思想 适配器模式类似,以后也会遇到意思接近一样的设计模式。在开发中一般多个模式混用,且根据不同的场景进行搭配,桥接模式也是结构型模式将抽象的部分和实现的部分分离,使它们都可以独立的变化。通俗来说,就是通…

初识Java 1-1 面向对象的语言

目录 引用的作用 数据的储存 常见的数据储存方式 特殊储存的基本类型 数组 销毁对象 基本类型的作用域 对象的作用域 创建新类型 - class关键字 方法、参数和返回值 参数列表 编写程序 名称可见性 使用组件 static关键字 Java程序 编程风格(驼峰式…

本地化部署ChatGLM2-6B模型

本地化部署ChatGLM2-6B模型 简介硬件需求 环境部署安装Miniconda创建虚拟环境下载模型和源码安装依赖GPU部署CPU部署 运行程序GPU模式CPU模式命令行运行网页版运行API运行 简介 ChatGLM是清华大学开源的方案,中文效果还是很不错的。基于 General Language Model (G…

聚类分析 | MATLAB实现基于AHC聚类算法可视化

聚类分析 | MATLAB实现基于AHC聚类算法可视化 目录 聚类分析 | MATLAB实现基于AHC聚类算法可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 AHC聚类算法,聚类结果可视化,MATLAB程序。 Agglomerative Hierarchical Clustering(自底…

CG MAGIC分享如何3d Max新版本如何能在旧版本中打开呢?

三维行业来说,无论是三维软件还是插件,都是在持续更新功能的。 3d Max这款软件,自然也不例外,不断推出新版本以提供更多强大的功能和工具。 随着新版本的发布,旧版本用户可能面临一个问题: 3d Max新版本…

java练习8.100m小球落地

题目: 如一个小球从100米高度自由落下,每次落地后就反跳回原高度的一半。 那么求它在第10次落地时,共经过多少米?第10次反弹多高? public static void main(String[] args) {/*假如一个小球从100米高度自由落下,每次落…

PHP自己的框架cookie()使用(完善篇七)

1、PHP自己的框架cookie() 2、cookie类&#xff08;CookieBase.php&#xff09; <?php class CookieBase {/*** 设置cookie*/public static function set($name, $value, $expire 3600, $path , $domain , $secure false, $httponly false) {setcookie($name, $valu…

【InsCode】InsCode打造的JavaSE与Linux命令互融的伪Linux文件系统小项目

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Ja…

python网络爬虫指南二:多线程网络爬虫、动态内容爬取(待续)

文章目录 一、多线程网络爬虫1.1 线程的基础内容、GIL1.2 创建线程的两种方式1.3 threading.Thread类1.4 线程常用方法和锁机制1.5 生产者-消费者模式1.5.1 生产者-消费者模式简介1.5.2 Condition 类协调线程 1.6 线程中的安全队列1.6 多线程爬取王者荣耀壁纸1.6.1 网页分析1.6…

dolphinschedule配置企微告警服务(WeChat群组)

一、前置说明 ds配置好工作流后&#xff0c;比较重要的一个就是上线后的监控报警服务&#xff0c;如果你是基于企微作为协同办公的&#xff0c;WeChat群组预警必须是要安排上的&#xff0c;文章基于自建应用配合群组方式构建预警群&#xff0c;接入后&#xff0c;任务成功或者…

Java注解与反射

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Java注解与反射 Java注解和反射是Java语言中两个强大的特性&#xff0c;它们可以一起使用以实现动态的、灵活的编程和元数据处理 注解 Java注解&#xff08;Annotatio…

4.1011

目录 四次挥手中收到乱序的FIN包会如何处理&#xff1f; 在 TIME_WAIT 状态的 TCP 连接&#xff0c;收到 SYN 后会发生什么&#xff1f; 四次挥手中收到乱序的FIN包会如何处理&#xff1f; 如果FIN报文比数据包先道道客户端&#xff0c;此时FIN是一个乱序报文&#xff0c;此时…

【LeetCode-中等题】2. 两数相加

文章目录 题目方法一&#xff1a;借助一个进制位&#xff0c;以及更新尾结点方法一改进&#xff1a;相比较第一种&#xff0c;给head一个临时头节点&#xff08;开始节点&#xff09;&#xff0c;最后返回的时候返回head.next&#xff0c;这样可以省去第一次的判断 题目 方法一…

IdentityServer密码长度超长会导致跳转到登录页

应用系统项目的安全要求越来越高&#xff0c;基本都是采取https等加密证书传输&#xff0c;无法使用https的&#xff0c;也是要求不能明文传输内容&#xff0c;因此做一些等保要求&#xff0c;密码需要加密后才能传输给服务端&#xff0c;所以前端会采取一些密码手段&#xff0…