Opencv学习项目2——二维码解码

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

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

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值