You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyzbar解码二维码失败,寻求技术解决方案

解决pyzbar二维码解码失败的问题

核心排查与修复步骤

1. 确认图像读取是否正常

cv2.imread() 读取失败会返回None,这是最常见的触发点。先在代码中加入校验:

img = cv2.imread(png_files)
if img is None:
    print(f"无法读取图像:{png_files}")
    print("当前工作目录:", os.getcwd())
    exit()
  • 确保1.png和脚本在同一目录,或使用绝对路径(比如C:/test/1.png)
  • 检查文件名大小写(Linux/mac系统区分大小写,Windows不区分)

2. 修正代码逻辑错误

pyzbar的decode()返回的是条码对象列表,不是单个对象。原代码直接访问qrcode.data会在未识别到条码时抛出AttributeError,正确写法:

qrcodes = decode(img)
if qrcodes:
    qr_text = qrcodes[0].data.decode('utf-8')
    data_list.append(qr_text)
    filelist.append(png_files)
    timelist.append(str(datetime.now().strftime('%Y%m%d%H%M%S')))
else:
    print("未识别到二维码")

3. 图像预处理提升识别率

pyzbar对图像质量敏感,模糊、低对比度、噪声都会导致识别失败,添加预处理步骤:

# 转灰度图减少颜色干扰
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 阈值化增强黑白对比度
_, thresh_img = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 高斯降噪
blur_img = cv2.GaussianBlur(thresh_img, (3, 3), 0)
# 用预处理后的图像解码
qrcodes = decode(blur_img)

4. 检查pyzbar依赖完整性

pyzbar依赖底层zbar库,安装不完整会直接导致解码失败:

  • Windows:先安装zbar二进制包,再重装pyzbar:
    pip uninstall pyzbar -y
    pip install pyzbar
    
  • macOS:用Homebrew安装zbar后重装pyzbar:
    brew install zbar
    pip uninstall pyzbar -y
    pip install pyzbar
    
  • Linux:安装系统依赖后重装pyzbar:
    sudo apt-get install libzbar0
    pip uninstall pyzbar -y
    pip install pyzbar
    

5. 验证二维码有效性

用手机扫码工具或本地图像工具测试1.png中的二维码:

  • 如果其他工具也识别不了,说明二维码本身损坏、分辨率过低或格式不兼容
  • 如果其他工具能识别,调整预处理参数(比如阈值、模糊核大小)重试

修复后的完整示例代码

import xlwings as xw
import os
import cv2
from pyzbar.pyzbar import decode
from datetime import datetime

def main():
    png_files = '1.png'
    
    # 检查文件是否存在
    if not os.path.exists(png_files):
        print(f"文件不存在:{png_files}")
        return
        
    wb = xw.Book('2.xlsm')
    sht = wb.sheets[0]
    # 清空A-C列内容
    sht.range('A:C').clear_contents()
    
    # 设置表头
    sht.range('A1').value = '圖片名稱'
    sht.range('B1').value = '掃描時間'
    sht.range('C1').value = '條碼內容'

    # 读取并预处理图像
    img = cv2.imread(png_files)
    if img is None:
        print(f"图像读取失败:{png_files}")
        return
        
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, thresh_img = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    
    # 解码二维码
    qrcodes = decode(thresh_img)
    current_time = datetime.now().strftime('%Y%m%d%H%M%S')
    if qrcodes:
        qr_text = qrcodes[0].data.decode('utf-8')
        sht.range('A2').value = [png_files, current_time, qr_text]
        print("解码成功,数据已保存至Excel")
    else:
        sht.range('A2').value = [png_files, current_time, "未识别到二维码"]
        print("未识别到二维码")

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者張棋坤

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:25:32