Opencv学习项目5——pyzbar,numpy

news2024/11/27 4:38:40

上一次我们使用pyzbar进行解码二维码并将其内容显示在图像上,使用的是rect = barcode.rect来获取图像的坐标,这次我们使用另一种方法来获取坐标进行画框。

 Numpy介绍

NumPy 是一个用于科学计算的开源 Python 库,提供了对大量数值数据进行高效操作的功能。它是许多其他科学计算库(如 SciPy、Pandas 和 Matplotlib)的基础,并在数据科学、机器学习和工程等领域中广泛应用。以下是对 NumPy 的详细介绍,包括其核心功能和一些常见的应用。

核心功能

  1. N维数组对象 (ndarray):NumPy 的核心是 ndarray 对象,它是一个具有同质元素(即所有元素类型相同)的多维数组。提供了高效的存储和操作能力,比 Python 内置的列表更高效。

  2. 广播机制:允许不同形状的数组在算术运算中进行兼容处理,简化了代码编写,提高了性能。

  3. 标准数学函数:提供了大量的数学函数(如三角函数、统计函数、线性代数函数等),可直接作用于数组对象。

  4. 线性代数:具有强大的线性代数功能,如矩阵乘法、特征值分解、奇异值分解等。

  5. 随机数生成:提供了各种随机数生成器,用于创建随机样本、模拟数据等。

  6. 文件读写:支持从文本文件、二进制文件读取数据,并将数据写入文件。

代码实现

我们这里直接看代码然后进行介绍

import cv2
import numpy as np
from pyzbar.pyzbar import  decode

img = cv2.imread('qrcode.png')
himg, wimg, _ = img.shape
# 解码图像中的二维码
for barcode in decode(img):
    mydata = barcode.data.decode()
    print(mydata)

    # 获取二维码的多边形顶点
    pts = np.array([barcode.polygon], np.int32)
    pts = pts.reshape((-1, 1, 2))
    # 在图像上绘制多边形(即二维码的边框)
    cv2.polylines(img, [pts], True, (0,0,255), 3)
    pts2 = barcode.rect # 获取二维码的矩形范围
    cv2.putText(img, mydata, (pts2[0], pts2[1]-10), cv2.FONT_HERSHEY_COMPLEX,
                0.9, (0,0,255), 2)

cv2.imshow('Result', img)
cv2.waitKey(0)

barcode.polygon

  • barcode.polygon 是一个包含多个顶点的列表,每个顶点都表示二维码的一个角点。
  • 每个顶点是一个 Point 对象或一个类似的结构,包含 x 和 y 坐标。

np.array([barcode.polygon], np.int32)

  • np.array 是 NumPy 库的一个函数,用于创建一个 NumPy 数组。
  • [barcode.polygon] 将 barcode.polygon 包装在一个列表中。这是因为 np.array 需要一个序列来创建数组,而包装在列表中可以确保生成二维数组。
  • np.int32 指定了数组中每个元素的类型为 32 位整数。这样做是为了确保坐标是整数,这对于大多数图像处理任务来说是必要的,因为像素坐标通常是整数。

我这里使用 print(barcode.polygon)和print(pts)打印出来的,分别代表二维码左上角坐标、左下角坐标、右下角坐标、右上角坐标

34c207c89d644271962f971085053044.png

 pts = pts.reshape((-1, 1, 2)) 这行代码用于重塑数组的形状,使其适合于 OpenCV 中绘制多边形的要求。

  • reshape() 方法

    • reshape() 是 NumPy 数组的方法,用于改变数组的形状。
    • 在这里,pts 是一个 NumPy 数组,表示二维码的多边形顶点。
  • 参数解释

    • (-1, 1, 2)
      • -1 表示自动计算这个维度的大小,以确保与原始数据兼容。
      • 1 表示在结果数组中,每个顶点都是一个单独的块。
      • 2 表示每个顶点有两个坐标值(x 和 y)。
  • 具体效果

    • 在这种情况下,pts 是一个二维数组,其中每行表示一个顶点,每个顶点由一对坐标值表示。

重塑 pts 数组的目的是确保在调用 OpenCV 的多边形绘制函数时,能够正确地解释每个顶点的坐标。这种形状确保了顶点数据与 OpenCV 绘图函数的期望格式匹配,从而顺利地在图像上绘制二维码的边框或其他多边形。

 7060426fbc024f4b9711817b07377109.png

cv2.polylines(img, [pts], True, (0,0,255), 3)

这行代码使用 OpenCV 的 cv2.polylines 函数来在图像上绘制多边形,具体解释如下:

  • img:表示要绘制多边形的图像。
  • [pts]:包含了多边形顶点的数组。将其包装在一个列表中传递给 cv2.polylines 函数。
  • True:表示绘制闭合的多边形,即将起始点和结束点连接起来,形成一个封闭的形状。
  • (0, 0, 255):表示绘制多边形的颜色,这里是红色。颜色通常以 (B, G, R) 的顺序指定,每个通道的取值范围是 0 到 255。
  • 3:表示绘制线条的粗细,即线条的宽度为 3 个像素。

效果演示

8bc31d41375c42458abe754f244735d9.png

这个和之前效果一样,我觉得是没有之前的方便,因为这个putText还是使用了pts2 = barcode.rect

不如画框也使用barcode.rect来获取坐标

  # 获取二维码的多边形顶点
    pts = np.array([barcode.polygon], np.int32)
    pts = pts.reshape((-1, 1, 2))
    # 在图像上绘制多边形(即二维码的边框)
    cv2.polylines(img, [pts], True, (0,0,255), 3)
    pts2 = barcode.rect # 获取二维码的矩形范围
    cv2.putText(img, mydata, (pts2[0], pts2[1]-10), cv2.FONT_HERSHEY_COMPLEX,
                0.9, (0,0,255), 2)

 也是多理解一些反正,就这样也是完成了,有兴趣的可以关注一下,谢谢

 

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

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

相关文章

【泛微系统】解决启动非标功能时提示客户ID不一致的问题

解决启动非标时提示CID不一致的问题 泛微OA系统是一个非常丰富的系统,我们在日常工作中会经常遇到很多业务需求,我们会用到很多功能来承载这些需求的实现;OA系统里有标准功能,也有非标准的功能;对于非标准的功能需要打非标补丁包; 有些同学在个人学习系统的过程中会安装本…

STM32项目分享:家庭环境监测系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.…

【性能优化】表分桶实践最佳案例

分桶背景 随着企业的数据不断增长,数据的分布和访问模式变得越来越复杂。我们前面介绍了如何通过对表进行分区来提高查询效率,但对于某些特定的查询模式,特别是需要频繁地进行数据联接查或取样的场景,仍然可能面临性能瓶颈。此外…

VisualBox 虚拟机 Ubunut 18.04 在大显示器上黑屏的问题

在小屏幕上显示没有问题,但是移动到大显示器上就黑屏了,并且不能铺满,如下所示 如果我希望它铺满整个屏幕,如何解决呢? 下面是解决方法: 虚拟机底部这个按钮,右键 产生菜单,按这个选…

基于STM8系列单片机驱动74HC595驱动两个3位一体的数码管

1)单片机/ARM硬件设计小知识,分享给将要学习或者正在学习单片机/ARM开发的同学。 2)内容属于原创,若转载,请说明出处。 3)提供相关问题有偿答疑和支持。 为了节省单片机MCU的IO口资源驱动6个数码管&…

mongodb嵌套聚合

db.order.aggregate([{$match: {// 下单时间"createTime": {$gte: ISODate("2024-05-01T00:00:00Z"),$lte: ISODate("2024-05-31T23:59:59Z")}// 商品名称,"goods.productName": /美国皓齿/,//订单状态 2:待发货 3:已发货 4:交易成功…

强化学习中的自我博弈(self-play)

自我博弈(Self-Play)[1]是应用于智能体于智能体之间处于对抗关系的训练方法,这里的对抗关系指的是一方的奖励上升必然导致另一方的奖励下降。通过轮流训练双方的智能体就能使得双方的策略模型的性能得到显著提升,使得整个对抗系统…

13.1.k8s集群的七层代理-ingress资源(进阶知识)

目录 一、ingress概述 1.前言 2.问题 3.ingress资源 二、ingress-nginx是什么 三、ingress-nginx 实现原理 四、部署ingress-nginx 1.获取部署文件 ingress-nginx.yaml 2.部署ingress-nginx 3.检查部署是否成功 五、编写使用Ingress样例代码 1.Ingress资源对象yaml文…

【滚动哈希 二分查找】1044. 最长重复子串

本文涉及知识点 滚动哈希 二分查找算法合集 LeetCode 1044. 最长重复子串 给你一个字符串 s ,考虑其所有 重复子串 :即 s 的(连续)子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。 返回 任意一个 可能具…

深入理解前端缓存

前端缓存是所有前端程序员在成长历程中必须要面临的问题,它会让我们的项目得到非常大的优化提升,同样也会带来一些其它方面的困扰。大部分前端程序员也了解一些缓存相关的知识,比如:强缓存、协商缓存、cookie等,但是我…

攻防世界-5-1

下载文件发现是一个没有尾缀的文件,扔winhex,emmmm还是没看出来 搜了一圈,发现用xortool 得到key之后,跑一下脚本 得到flag: wdflag{You Are Very Smart}

基于uni-app和图鸟UI的智慧农业综合管控平台小程序技术实践

摘要: 随着信息化技术的飞速发展,智慧农业已成为推动农业现代化、提升农业生产效率的重要手段。本文介绍了一款基于uni-app框架和图鸟UI设计的智慧农业综合管控平台小程序,该平台整合了传感器控制、农业数据监测、设施管控、农业新闻传播以及…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(三)-shell语法

主要通过讲解shell中的一些基本语法,可以当作日常的笔记来进行查询和记忆。 文章目录 前言 一、shell 二、shell语法 1.运行方式 2.注释 3.变量 4.默认变量 5.数组 总结 前言 主要通过讲解shell中的一些基本语法,可以当作日常的笔记来进行查询和记忆。…

Python | Leetcode Python题解之第172题阶乘后的零

题目: 题解: class Solution:def trailingZeroes(self, n: int) -> int:ans 0while n:n // 5ans nreturn ans

android倒计时封装(活动进入后台,倒计时依然能正常计时)

public class TimeUtils { /倒计时时长 单位:秒/ public static int COUNT 20*60; /当前做/ private static int CURR_COUNT 0; /预计结束的时间/ private static long TIME_END 0; /计时器/ private static Timer countdownTimer; /显示倒计时的textVi…

FLASH闪存

一、FLASH简介 1、FLASH简介 (1)STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程 (2)读写FLASH的用途…

postman国内外竞争者及使用详解分析

一、postman简介 Postman 是一款广泛使用的 API 开发和测试工具,适用于开发人员和测试人员。它提供了一个直观的界面,用于发送 HTTP 请求、查看响应、创建和管理 API 测试用例,以及自动化 API 测试工作流程。以下是 Postman 的主要功能和特点…

ShareX,屏幕截图、屏幕录制和文件共享,还提供了丰富的高级功能和自定义选项

ShareX是一个免费开源的Windows应用程序,用于屏幕截图、屏幕录制和文件共享。它不仅支持基本的屏幕截图功能,还提供了丰富的高级功能和自定义选项,使其成为提高工作效率和截图体验的利器。以下是ShareX v16.1.0便携版的主要功能和特色&#x…

蓝桥杯 经典算法题 求解完全背包问题

题目: 题解: 和01背包基本完全一样。小局部最优的策略也是一样:是否选当前局部的最后一项。唯一的不同点在于物品是无线的导致在表示选择当前物品的状态写法发生了改变:由dp[i-1][j-w[i]]变为了dp[i][j-w[i]]因为这样能够表示最后…

Java 10新特性介绍

Java 10是Java平台的一个重要更新,它引入了多项新特性和改进。以下是一些主要的新特性: 局部变量类型推断(var关键字) Java 10允许使用var关键字来声明局部变量,而无需显式指定变量的类型。编译器会根据变量赋值的上下…