Opencv学习项目5——pyzbar,numpy

2024-06-22 07:12

本文主要是介绍Opencv学习项目5——pyzbar,numpy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一次我们使用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  decodeimg = 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)

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

 

这篇关于Opencv学习项目5——pyzbar,numpy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083629

相关文章

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间