使用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()