该程序的主要目标是通过普通网络摄像头采集的图像识别条形码。程序需检测满足以下条件的条形码:
特点
- 任意方向
- 正面或倾斜视角
- 不同尺寸及与摄像头距离各异
- 非理想光照条件下拍摄(阴影、镜面反射等)
- 附着于圆形瓶身/容器导致图像弯曲
- 位于褶皱表面导致图像变形
上述条件表明,本系统的核心在于构建鲁棒的条形码识别体系,且对摄像头朝向不作严格限制(在合理范围内)。
▼ 条形码类型多样性
条形码存在多种变体。本次演示版优先处理一维条形码,二维条形码(如QR码)将在后续版本实现。
▼ EAN-13与UPC
EAN-13和UPC是最常见的两种一维条形码。因开发时间有限,演示版将重点聚焦于此。
▼ 解决方案
本软件采用检测与解码分离的架构。所有一维条形码本质上都由不同粗细的黑白线条序列构成,因此检测逻辑可通用于EAN-13/EAN-8/UPC-A/UPC-B等类型,具体解码工作则由各类条形码专属的解码器完成。
▼ 类结构图示(BarcodeReader类图)
BarcodeReader1D类提供两种搜索策略:
- 沿N条等距水平扫描线检测条形码特征模式(N值可配置)
- 类二分查找法:先检测搜索区域中线(1/2处),再检测1/4和3/4位置,继而1/8/3/8/5/8/7/8处,依此类推
扫描线检测时,系统会:
- 提取灰度极值
- 应用最优阈值算法(适应不同光照/过曝/欠曝条件)
- 收集二值化样本交由解码器验证模式匹配
当M条扫描线均验证通过且解码类型一致时,判定为有效识别(M默认值为3,可配置)
▼ 解码器工作原理
BarcodeDecoder类对二值化扫描样本进行游程直方图分析,例如:
11111100001111111111110000000110000000000000100001111110000…
通过峰值检测映射到特定条码的允许宽度(如EAN-13含4种宽度)。考虑到倾斜视角、曲面变形及噪声干扰,系统采用智能直方图分析与平滑处理来还原真实峰值。
▼ EAN-13解码细则
标准规定EAN-13包含95个模块(最细线条宽度0.33mm)。EAN13BarcodeDecoder类设定最小识别长度为95像素。
解码流程:
- 直方图分析确定模块宽度(允许±0.5模块容差)
- 添加第5虚拟峰值处理非数据区(如静区)
- 分段解码:
- 前6位数字+首位占位符(尝试A/B编码表)
- 中间分隔符
- 根据前6位编码表反推首位
- 后段数字(统一使用C表)
- 结尾分隔符+静区
- 校验和验证
- 可选2/5位附加码处理(复用A/B表)
- 附加码校验
▼ 测试数据
为验证算法鲁棒性,我们使用普通网络摄像头在自然光条件下拍摄真实商品条形码(点击查看大图):