二维码和条形码识别

使用pyzbar模块来识别二维码和条形码,pyzbar是python封装ZBar的模块,ZBar是一个开源软件,用来从图像中读取条形码,支持多种编码,比如EAN-13/UPC-A、UPC-E、EAN-8、代码128、代码39、交错2/5以及二维码。Windows系统安装pyzbar模块:pip inatsll pyzbar

一、python识别二维码

1、批量识别

import os
import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
from pyzbar.pyzbar import decode  

# 批量处理目录中的所有图像
input_folder = "data/01/images"  # 图像文件夹路径
output_folder = "./data/01/results"  # 输出文件夹路径

# 确保输出文件夹存在
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历目录中的所有图像文件
for filename in os.listdir(input_folder):
    # 只处理图像文件(根据扩展名过滤)
    if filename.endswith(".png") or filename.endswith(".jpg") or filename.endswith(".jpeg"):
        input_image_path = os.path.join(input_folder, filename)

        # 读取图像
        img = cv.imread(input_image_path)

        # 解析图像并查找所有二维码
        QRCodes = decode(img)

        # 检查是否识别到二维码
        if not QRCodes:
            print(f"未识别到二维码:{filename}")
        else:
            for QRCode in QRCodes:
                stringData = QRCode.data.decode('utf-8')  # 获取解码后的二维码数据
                print(f"二维码字符串是:\"{stringData}\"")

                # 绘制二维码边框
                points = np.array([QRCode.polygon], np.int32)
                points = points.reshape((-1, 1, 2))
                cv.polylines(img, [points], True, (0, 255, 0), 5)

                # 在二维码区域上绘制字符串
                rectPoints = QRCode.rect
                cv.putText(img, stringData, (rectPoints[0], rectPoints[1]), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255),
                           2)

            # 保存处理后的图像
            output_path = os.path.join(output_folder, f'{os.path.splitext(filename)[0]}_result.jpg')
            cv.imwrite(output_path, img)  # 使用 OpenCV 的 imwrite() 保存图像
            print(f"图像 {filename} 处理完毕,结果已保存为:{output_path}")

            # 可选:显示图像(如果需要实时查看处理效果)
            # img_rgb = img[:, :, ::-1]  # 将图像从BGR转为RGB,因为OpenCV加载图像时是BGR格式
            # plt.imshow(img_rgb)
            # plt.show()


2、摄像头实时识别

import os,time
import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
from pyzbar.pyzbar import decode   

# 打开摄像头,0 表示默认摄像头
cap = cv.VideoCapture(0)

frame_count = 0  # 用于计数每一帧


# # 获取默认摄像头的分辨率
# frame_width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
# frame_height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
#
# # 输出分辨率
# print(f"摄像头默认分辨率: 宽度 = {frame_width}, 高度 = {frame_height}")

# 设置摄像头分辨率为 1280x720
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720)


while True:
    # 读取视频帧
    ret, img = cap.read()

    # 如果读取失败,退出循环
    if not ret:
        print("无法读取摄像头视频流")
        break
    # 解析图像并查找所有二维码
    QRCodes = decode(img)    
    
    # 检查是否识别到条形码
    if not QRCodes:
        print("未识别到二维码。")  # 如果没有识别到二维码,输出提示信息

    for QRCode in QRCodes:
        print(QRCode)
        stringData = QRCode.data.decode('utf-8')  
        print("二维码字符串是:\"" + stringData + "\"")
    # 绘制出二维码边框
        points = np.array([QRCode.polygon], np.int32)  
        points = points.reshape((-1 ,1 ,2))
        cv.polylines(img, [points], True, (0 ,255 ,0), 5)
    # 在二维码区域上绘制字符串
        rectPoints = QRCode.rect   
        cv.putText(img, stringData, (rectPoints[0], rectPoints[1]), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0 ,0 ,255), 2)

    # 获取当前日期(格式:YYYYMMDD)
    current_date = time.strftime('%Y%m%d')  # 例如 '20250625'

    # 创建日期文件夹路径,如果不存在就创建它
    folder_path = os.path.join('./data/01/results/2/', current_date)
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)  # 创建文件夹

    # 自动保存每一帧,文件名为 'frame_帧号_时间戳.jpg'
    frame_count += 1
    timestamp = time.strftime('%H%M%S')  # 获取当前时间戳(时分秒)作为文件名的一部分
    output_path = os.path.join(folder_path, f'frame_{frame_count}_{timestamp}.jpg')
    cv.imwrite(output_path, img)  # 保存每一帧图像
    print(f"图像已保存为:{output_path}")
	
	# 显示图像
    cv.imshow('QRCode Detection', img)

    # 按 'q' 键退出循环
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源
cap.release()
cv.destroyAllWindows()


二、python识别条形码

1、批量识别

import os
import cv2 as cv
import numpy as np
from pyzbar.pyzbar import decode
import matplotlib.pyplot as plt

# 设置图像输入和输出文件夹路径
input_folder = "data/02/images"  # 图像文件夹路径
output_folder = "./data/02/results"  # 结果保存文件夹路径

# 确保输出文件夹存在
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历目录中的所有图像文件
for filename in os.listdir(input_folder):
    # 只处理图像文件(根据扩展名过滤)
    if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".jpeg"):
        input_image_path = os.path.join(input_folder, filename)

        # 读取图像
        img = cv.imread(input_image_path)

        # 解码图像中的所有条形码
        BARCodes = decode(img)

        # 检查是否识别到条形码
        if not BARCodes:
            print(f"未识别到条形码:{filename}")
        else:
            for BARCode in BARCodes:
                stringData = BARCode.data.decode('utf-8')  # 解码条形码的字符串数据
                print(f"条形码字符串是:\"{stringData}\"")

                # 绘制条形码边框
                points = np.array([BARCode.polygon], np.int32)
                points = points.reshape((-1, 1, 2))  # numpy reshape 以适应绘制格式
                cv.polylines(img, [points], True, (0, 255, 0), 5)  # 绘制绿色的边框

                # 获取条形码的矩形区域并在上面绘制文本
                rectPoints = BARCode.rect
                cv.putText(img, stringData, (rectPoints[0] - 20, rectPoints[1] - 5), cv.FONT_HERSHEY_SIMPLEX, 1,
                           (0, 0, 255), 2)

            # 获取输入文件名(不包含路径和扩展名)
            filename_without_extension = os.path.splitext(filename)[0]

            # 保存处理后的图像
            output_path = os.path.join(output_folder, f'{filename_without_extension}_result.jpg')
            cv.imwrite(output_path, img)  # 使用 OpenCV 的 imwrite() 保存图像
            print(f"图像 {filename} 处理完毕,结果已保存为:{output_path}")

            # 可选:显示图像(如果需要实时查看处理效果)
            # img_rgb = img[:, :, ::-1]  # 将图像从BGR转为RGB,因为OpenCV加载图像时是BGR格式
            # plt.imshow(img_rgb)
            # plt.show()



2、摄像头实时识别

import os
import cv2 as cv
import numpy as np
import time
from pyzbar.pyzbar import decode
import matplotlib.pyplot as plt

# 打开摄像头,0表示默认摄像头
cap = cv.VideoCapture(0)

frame_count = 0  # 用于计数每一帧


# # 获取默认摄像头的分辨率
# frame_width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
# frame_height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
#
# # 输出分辨率
# print(f"摄像头默认分辨率: 宽度 = {frame_width}, 高度 = {frame_height}")

# 设置摄像头分辨率为 1280x720
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720)


while True:
    # 读取视频帧
    ret, img = cap.read()

    # 如果读取失败,退出循环
    if not ret:
        print("无法读取摄像头视频流")
        break

    # 解码图像中的所有条形码
    BARCodes = decode(img)

    # 检查是否识别到条形码
    if not BARCodes:
        print("未识别到条形码。")  # 如果没有识别到条形码,输出提示信息

    for BARCode in BARCodes:
        print(BARCode)
        stringData = BARCode.data.decode('utf-8')  # 解码条形码的字符串数据
        print("条形码字符串是:\"" + stringData + "\"")

        # 绘制条形码边框
        points = np.array([BARCode.polygon], np.int32)
        points = points.reshape((-1, 1, 2))  # numpy reshape 以适应绘制格式
        cv.polylines(img, [points], True, (0, 255, 0), 5)  # 绘制绿色的边框

        # 获取条形码的矩形区域并在上面绘制文本
        rectPoints = BARCode.rect
        cv.putText(img, stringData, (rectPoints[0] - 20, rectPoints[1] - 5), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    # 获取当前日期(格式:YYYYMMDD)
    current_date = time.strftime('%Y%m%d')  # 例如 '20250625'

    # 创建日期文件夹路径,如果不存在就创建它
    folder_path = os.path.join('./data/02/results/2/', current_date)
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)  # 创建文件夹

    # 自动保存每一帧,文件名为 'frame_帧号_时间戳.jpg'
    frame_count += 1
    timestamp = time.strftime('%H%M%S')  # 获取当前时间戳(时分秒)作为文件名的一部分
    output_path = os.path.join(folder_path, f'frame_{frame_count}_{timestamp}.jpg')
    cv.imwrite(output_path, img)  # 保存每一帧图像
    print(f"图像已保存为:{output_path}")

    # 显示图像(使用 OpenCV 显示图像)
    cv.imshow('BARCode Detection', img)  # 显示图像窗口

    # 按 'q' 键退出循环
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源
cap.release()
cv.destroyAllWindows()

三、同时处理二维码和条形码的识别

import os
import time
import numpy as np
import cv2 as cv
from pyzbar.pyzbar import decode

# 打开摄像头,0表示默认摄像头
cap = cv.VideoCapture(0)

frame_count = 0  # 用于计数每一帧

# 设置摄像头分辨率为 1280x720
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720)

# 获取当前日期(格式:YYYYMMDD)
current_date = time.strftime('%Y%m%d')  # 例如 '20250625'

# 创建日期文件夹路径,如果不存在就创建它
folder_path = os.path.join('./data/03/results/', current_date)
if not os.path.exists(folder_path):
    os.makedirs(folder_path)  # 创建文件夹

while True:
    # 读取视频帧
    ret, img = cap.read()

    # 如果读取失败,退出循环
    if not ret:
        print("无法读取摄像头视频流")
        break

    # 解析图像并查找所有二维码和条形码
    decoded_objects = decode(img)

    # 遍历所有识别出的二维码和条形码
    for obj in decoded_objects:
        # 获取二维码或条形码的类型(例如 QRCode 或 Barcode)
        code_type = obj.type
        string_data = obj.data.decode('utf-8')

        # 打印解码后的字符串
        print(f"{code_type} 字符串是:\"{string_data}\"")

        # 绘制二维码或条形码的边框
        points = np.array([obj.polygon], np.int32)
        points = points.reshape((-1, 1, 2))
        cv.polylines(img, [points], True, (0, 255, 0), 5)  # 绘制绿色的边框

        # 获取二维码或条形码的矩形区域并在上面绘制文本
        rect_points = obj.rect
        cv.putText(img, string_data, (rect_points[0] - 20, rect_points[1] - 5), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    # 自动保存每一帧,文件名为 'frame_帧号_时间戳.jpg'
    frame_count += 1
    timestamp = time.strftime('%H%M%S')  # 获取当前时间戳(时分秒)作为文件名的一部分
    output_path = os.path.join(folder_path, f'frame_{frame_count}_{timestamp}.jpg')
    cv.imwrite(output_path, img)  # 保存每一帧图像
    print(f"图像已保存为:{output_path}")

    # 显示图像
    cv.imshow('Barcode and QRCode Detection', img)

    # 按 'q' 键退出循环
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源
cap.release()
cv.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值