需求背景
在智能制造行业已经多年,跟自己主要打交道的就是电子物料管理。公司有一个智能条码注册站产品,主要是依靠海康的相机拍照然后解析电子料盘中的条码信息。随着AI的发展,利用AI辅助条码的解析也是一个不错的发展方向。后续还会不断更新和丰富该功能实践。
根据需求选技术栈
模块 | 工具/库 | 说明 |
---|---|---|
条码目标检测 | YOLOv8 | 轻量、速度快、适合自定义训练 |
图像处理 | OpenCV | 图像裁剪、绘图等功能 |
条码解码 | pyzbar | 支持常见的一维码/二维码 |
标注工具 | LabelImg | 可视化框选目标,导出 YOLO 标签 |
编程语言 | Python 3.x | 主流、易用、生态强大 |
系统功能流程图

功能实现
1、引入相关依赖
pip install opencv-python pyzbar ultralytics
2、使用系统训练模型
model = YOLO("yolov8n.pt")
如果利用系统默认的模型,比如yolov8n.pt,这样会无法识别条码,因为模型压根没训练条码相关的内容,所以压根识别不了。查看结果多半就是这样的提示:
js
result = ultralytics.engine.results.Results object with attributes: boxes: ultralytics.engine.results.Boxes object keypoints: None masks: None names: {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus', 6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant', 11: 'stop sign', 12: 'parking meter', 13: 'bench', 14: 'bird', 15: 'cat', 16: 'dog', 17: 'horse', 18: 'sheep', 19: 'cow', 20: 'elephant', 21: 'bear', 22: 'zebra', 23: 'giraffe', 24: 'backpack', 25: 'umbrella', 26: 'handbag', 27: 'tie', 28: 'suitcase', 29: 'frisbee', 30: 'skis', 31: 'snowboard', 32: 'sports ball', 33: 'kite', 34: 'baseball bat', 35: 'baseball glove', 36: 'skateboard', 37: 'surfboard', 38: 'tennis racket', 39: 'bottle', 40: 'wine glass', 41: 'cup', 42: 'fork', 43: 'knife', 44: 'spoon', 45: 'bowl', 46: 'banana', 47: 'apple', 48: 'sandwich', 49: 'orange', 50: 'broccoli', 51: 'carrot', 52: 'hot dog', 53: 'pizza', 54: 'donut', 55: 'cake', 56: 'chair', 57: 'couch', 58: 'potted plant', 59: 'bed', 60: 'dining table', 61: 'toilet', 62: 'tv', 63:
我们从上面的结果可以看到有一个names对象,这就是yolov8n.pt模型自己自带的基础模型,也就是大概能识别names里面包含的内容,我们从中可以看出,包括一些,人、自行车、小汽车、摩托车等等都是一些物品相关的,和我们今天的主角条码barcode,毫无关系。
3、打造属于我们自己的训练模型
-
✅ 准备条码图片数据集
-
✅ 使用工具标注条码区域(生成 YOLO 格式标签)
-
✅ 构建数据集目录结构
-
✅ 用 YOLOv8 开始训练模型
-
✅ 用训练好的模型识别条码(替换之前的
yolov8n.pt
)
这里模型的构建和训练我不做过多的详细描述,内容有点多。需要的可以单独私信,或者单开一篇文章来叙述。执行训练100次模型结果如下:

源码展示
js
import cv2
from pyzbar import pyzbar
from ultralytics import YOLO
# 使用你训练好的模型
model = YOLO("runs/detect/train/weights/best.pt")
# 读取图像
image = cv2.imread("./images/xie.png")
# 使用模型进行预测
results = model(image)
# 遍历每个检测结果(通常这里只有一个)
for result in results:
boxes = result.boxes
if boxes is not None:
for box in boxes:
# 获取框的坐标
x1, y1, x2, y2 = map(int, box.xyxy[0])
# 截取框中的图像区域
roi = image[y1:y2, x1:x2]
# 解码该区域中的条码
barcodes = pyzbar.decode(roi)
for barcode in barcodes:
data = barcode.data.decode("utf-8")
barcode_type = barcode.type
print(f"识别到条码 [{barcode_type}]: {data}")
# 绘制文字
cv2.putText(image, data, (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
# 绘制检测框
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 显示检测结果
cv2.imshow("YOLO Barcode Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
测试用例
在条码测试过程中,我们借助条码生成工具,来自定义我们测试的条码信息,然后再给到程序中运行,输出识别的条码结果。


测试结果


总结与展望
在这分享主要就是一个学习分享的过程,第一次接触大模型开发,也算是牛刀小试初步成功。本项目实现了一个完整的图像级条码识别系统,利用 YOLOv8 实现高效目标检测,结合 pyzbar 解码技术完成实际应用。但是离我们的目标还是有点远的,慢慢的可以将照片引入变为机器拍照。条码识别,可以变成多条码和多类型条码识别等。