上一次我们使用pyzbar进行解码二维码并将其内容显示在图像上,使用的是rect = barcode.rect来获取图像的坐标,这次我们使用另一种方法来获取坐标进行画框。
Numpy介绍
NumPy 是一个用于科学计算的开源 Python 库,提供了对大量数值数据进行高效操作的功能。它是许多其他科学计算库(如 SciPy、Pandas 和 Matplotlib)的基础,并在数据科学、机器学习和工程等领域中广泛应用。以下是对 NumPy 的详细介绍,包括其核心功能和一些常见的应用。
核心功能
N维数组对象 (
ndarray
):NumPy 的核心是ndarray
对象,它是一个具有同质元素(即所有元素类型相同)的多维数组。提供了高效的存储和操作能力,比 Python 内置的列表更高效。广播机制:允许不同形状的数组在算术运算中进行兼容处理,简化了代码编写,提高了性能。
标准数学函数:提供了大量的数学函数(如三角函数、统计函数、线性代数函数等),可直接作用于数组对象。
线性代数:具有强大的线性代数功能,如矩阵乘法、特征值分解、奇异值分解等。
随机数生成:提供了各种随机数生成器,用于创建随机样本、模拟数据等。
文件读写:支持从文本文件、二进制文件读取数据,并将数据写入文件。
代码实现
我们这里直接看代码然后进行介绍
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)打印出来的,分别代表二维码左上角坐标、左下角坐标、右下角坐标、右上角坐标
pts = pts.reshape((-1, 1, 2))
这行代码用于重塑数组的形状,使其适合于 OpenCV 中绘制多边形的要求。
reshape() 方法:
reshape()
是 NumPy 数组的方法,用于改变数组的形状。- 在这里,
pts
是一个 NumPy 数组,表示二维码的多边形顶点。参数解释:
(-1, 1, 2)
:
-1
表示自动计算这个维度的大小,以确保与原始数据兼容。1
表示在结果数组中,每个顶点都是一个单独的块。2
表示每个顶点有两个坐标值(x 和 y)。具体效果:
- 在这种情况下,
pts
是一个二维数组,其中每行表示一个顶点,每个顶点由一对坐标值表示。重塑
pts
数组的目的是确保在调用 OpenCV 的多边形绘制函数时,能够正确地解释每个顶点的坐标。这种形状确保了顶点数据与 OpenCV 绘图函数的期望格式匹配,从而顺利地在图像上绘制二维码的边框或其他多边形。
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 个像素。
效果演示
这个和之前效果一样,我觉得是没有之前的方便,因为这个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)
也是多理解一些反正,就这样也是完成了,有兴趣的可以关注一下,谢谢