【图像分割】提取图像中的二维码

问题:给你一张带有二维码的图片,将其提取

初始代码:

import cv2
from pyzbar.pyzbar import decode

# 读取图像
image = cv2.imread('your_image.png')

# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#输出灰度图像
cv2.imwrite('gray.jpg', gray)

# 使用二值化处理来突出显示二维码(固定阈值二值化)
#_, binary_image = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
_, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
#输出二值图像
cv2.imwrite('binary_image.jpg', binary_image)

# 使用PyZbar库来检测并解码二维码
decoded_objects = decode(binary_image)

# 遍历解码的结果并提取第一个二维码
for obj in decoded_objects:
    data = obj.data.decode('utf-8')
    print("二维码内容:", data)

    # 获取二维码的位置信息
    points = obj.polygon
    if len(points) >= 4:
        # 将 points 转换为包含 (x, y) 元组的列表
        contour = [(point.x, point.y) for point in points]
        # 使用 cv2.polylines 绘制轮廓
        cv2.polylines(image, [contour], isClosed=True, color=(0, 255, 0), thickness=2)

        # 保存提取出的二维码为单独的图像文件
        x, y, w, h = cv2.boundingRect(contour)
        qr_code_image = image[y:y + h, x:x + w]
        cv2.imwrite('qr_code_extracted.png', qr_code_image)
        print("已保存二维码图像为 qr_code_extracted.png")

# 显示包含二维码边框的原始图像
cv2.imshow('Image with QR Code Border', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

请确保将 'your_image.png' 替换为实际图像文件的路径。

上面代码出现报错:

cv2.polylines(image, [points], isClosed=True, color=(0, 255, 0), thickness=2) cv2.error: OpenCV(4.8.0) :-1: error: (-5:Bad argument) in function 'polylines' > Overload resolution failed: > - Can't parse 'pts'. Sequence item with index 0 has a wrong type > - Can't parse 'pts'. Sequence item with index 0 has a wrong type

大概的意思是:在使用 cv2.polylines 函数时,传递给函数的 pts 参数存在问题,导致无法解析。这个问题通常是由于参数类型不匹配或格式不正确引起的。

为了更准确地解决问题,可以尝试确保 contour 变量是正确的数据类型。以下是一个更新后的代码示例,尝试将 contour 转换为正确的NumPy数组:

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


# 读取图像
image = cv2.imread('your_image.png')

# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#输出灰度图像
cv2.imwrite('gray.jpg', gray)

# 使用二值化处理来突出显示二维码(固定阈值二值化)
#_, binary_image = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
_, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

#输出二值图像
cv2.imwrite('binary_image.jpg', binary_image)

# 使用PyZbar库来检测并解码二维码
decoded_objects = decode(binary_image)

# 遍历解码的结果并提取第一个二维码
for obj in decoded_objects:
    points = obj.polygon
    if len(points) >= 4:
        # 将 points 转换为NumPy数组
        points = np.array(points, dtype=np.int32)

        # 使用cv2.polylines绘制轮廓
        cv2.polylines(image, [points], isClosed=True, color=(0, 255, 0), thickness=2)

        # 保存提取出的二维码为单独的图像文件
        x, y, w, h = cv2.boundingRect(points)
        qr_code_image = image[y:y + h, x:x + w]
        cv2.imwrite('qr_code_extracted.png', qr_code_image)
        print("已保存二维码图像为 qr_code_extracted.png")

要确保以上代码能够正确提取出图像中的二维码,需要确保以下几点:

  1. 图像中含有可识别的二维码:首先确保你的输入图像中确实包含一个可识别的二维码。

  2. 图像质量:确保输入图像的质量足够好,没有过于模糊或损坏的部分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值