调个ZXing就能跑?工业级条码分分钟教你做人

关于作者

我接触视觉整整 10 年

机器视觉、烟草、煤矿等行业都有深度开发经验。从硬件选型、算法开发、模型训练,到上位机开发及部署,都在一线磨过

之前是多家公司人工智能团队的技术负责人。现在自己创业了,还在继续做视觉落地这件事。


在这里插入图片描述

作者说

之前写了好几篇关于目标检测、行为识别的文章,有朋友问我,你怎么不写写读码?

读码这个事吧,很多人觉得简单,不就是调个 ZXing 吗。

我自己当初也是这么想的。后来做了物流 DWS 项目,被软包装上的条码虐哭之后,才明白读码远没有看起来那么简单。它不像目标检测那样有模型迭代的空间,读码的很多问题根源在物理层面,算法能做的事情是有天花板的。

最近我花时间系统梳理了一下读码领域的技术演进,从最早的激光扫描到现在的深度学习,发现了一些很有意思的规律。这篇文章把我在读码上踩过的坑、用过的方案、以及整个领域正在发生的变化,如实记录下来。

这是踩坑实录的第十八篇。


凌晨三点还在挨操作员的骂

凌晨三点,快递分拣中心,双十一前夕。

传送带以每秒 1.5 米的速度跑着,一个白色塑料袋包裹嗖地飞过去。

12 面读码头,全部没读出来。

我盯着监控画面,包裹上的条码被揉成了一团皱巴巴的纸片。动态秤显示重量 0.3kg,体积测量正常,唯独那个条码,死活出不来。

分拣线后面已经积了二三十个包裹,操作员在手动扫码补录,一边扫一边骂。

这个场景我在物流 DWS 项目里见过太多次了。
在这里插入图片描述


01 读码技术50年,每次跃迁都是传感器驱动的

说踩坑之前,先聊点背景。了解技术是怎么走到今天的,你就知道为什么有些坑是"必然"的。

1949 年,费城一个研究生在海滩上划沙子,灵光一现,发明了条码的雏形。当时叫"牛眼码",同心圆形状,因为圆形在任何方向都能读。但 1950 年代的光电传感器太笨重了,这个专利在抽屉里躺了将近 20 年。
在这里插入图片描述

1974 年,俄亥俄州一家超市,一包箭牌口香糖成为第一个被 UPC 扫描的商品。那时候用的是氦氖激光器,台面那么大,单台几千美元。

真正的分水岭是 1987 年,激光二极管小型化。扫描器从桌面缩到手掌大小,成本从数千美元降到数百美元。Symbol Technologies 抓住了这个窗口,手持式激光扫描枪席卷了零售和仓储场景。

但你发现没有,激光扫描本质上只能读一维的信息——线条的宽度变化。二维码出现之后,激光直接废了。QR 码是 1994 年日本电装公司发明的,起因很朴素,丰田工厂装配线上工人需要快速扫多个条码,一维码跟不上流水线节奏。QR 码的设计有三个聪明的点,三个定位图案使任何角度都能识别、Reed-Solomon 纠错编码让 30% 面积损坏还能读、专为中日韩文字优化。而且电装放弃专利收费,任何人免费使用,这直接催生了今天 QR 码无处不在的局面。

二维码的普及反过来逼着扫描技术从激光转向图像传感器。CMOS 相机可以一次性拍整个区域,在图像里定位和解码所有可见的条码。这对工业自动化是革命性的——产线上不再需要精确对齐条码位置了。

50 年下来,一个规律很清楚,每次技术跃迁,驱动力都是"新传感器+新算法"的组合,而不是单一维度的突破。激光二极管使手持扫描枪成为可能,CMOS 传感器使图像读码成为可能,AI 芯片使端到端智能读码成为可能。算法永远是跟在硬件后面做优化的那一个。

记住这个规律,后面会用到。

02 DWS 系统,三件套里读码是最大的坑

回到我做的物流 DWS 项目。DWS 就是快递分拣里的"动态称重测量系统",核心功能三件套,读条码、测体积、称重量。听起来很 straightforward 对吧,实际做起来每一步都有坑,但最大的坑永远是读码。

典型的硬件配置是这样的。顶部一个线激光传感器做体积测量,底部一个线扫相机拍包裹底面条码,四周一圈读码头(6 面或 12 面),把包裹各个面都覆盖到。包裹上秤台的时候动态秤同步采集重量。所有数据汇总到工控机,匹配在一起上传分拣系统。

DWS 的读码方案经历了四代演进。

第一代单面扫描,顶部一台读码器,要求快递面单必须朝上。漏读率 20-30%,没法用。第二代三面/四面扫描,顶部加两侧加前方。漏读率降到 5-10%。第三代六面覆盖,上/下/左/右/前/后全覆盖,底部用线扫相机,其他面用面阵相机,配合反光镜。漏读率低于 1%。第四代在六面覆盖基础上加 AI 增强,自适应曝光、多条码语义过滤、软包装褶皱校正。

我参与的项目用的是第三代 12 面读码方案加底部线扫。理论上报率包裹不管怎么放,至少有一个面能被拍到。

在这里插入图片描述

这是理想情况。

实际跑起来你会发现,大概有 3% 到 5% 的包裹,所有面都拍到了,但条码就是读不出来。原因五花八门,条码被折叠、被污损、印在透明塑料袋上反光、贴在圆弧面上变形、还有那种热敏纸标签被磨得只剩半个的。

这里面最难的,是软包装。

03 软包装读码,DWS 的终极噩梦

衣服、枕头、毛绒玩具这些软包裹,是所有物流读码工程师的噩梦。不是技术有多难搞,是软包裹的物理特性把常规方案全部废掉了。

第一,表面不平。条码贴在塑料袋上,袋子鼓鼓囊囊,条码就跟着变形。一维码变成波浪形,二维码变成曲面投射。你以为图像上能看见条码就行了?变形到一定程度,解码算法直接认不出来。

第二,反光严重。白色或透明的塑料袋在光源下一照,条码区域直接变成一片白。调整光源角度?软包裹是软的,形状不固定,这个包裹不反光的角度,下一个包裹就反光了。
在这里插入图片描述

第三,包裹形态不可控。硬纸箱不管怎么放,六个面是确定的。软包裹可能团成一团,条码可能出现在任何位置,甚至被折叠到里面去。12 面读码头的覆盖逻辑是基于"面"设计的,但软包裹压根没有"面"这个概念。

实测数据,硬纸箱的读码率能做到 99.5% 以上,软包裹能到 95% 就已经很不错了。别小看这 4.5 个百分点,一天 10 万个包裹的话,那就是 4500 个要人工处理。分拣线后面排长队就是这么来的。

后来我查了业界的方案,发现有一条路子比我当时用的办法有效得多。

偏振片

东集有一款 X4 读码器的半偏振机型,专门针对铝塑膜、金属这些高反光材质。原理是通过物理方式过滤掉干扰性的反射杂光,只允许条码本身的漫反射光进入传感器。这比任何算法去反光都有效。

但我当时的项目没上偏振片,因为预算不够。所以这条经验就是,如果你的场景有反光问题,先买偏振片,几块钱一片,比调三天算法管用。

04 开源库 vs 商用方案,差距比你想的大

读码这个领域,开源和商用的差距是真实存在的,而且比大多数人以为的要大得多。

我先后用过 ZBar、ZXing、Halcon,以及 Datalogic 和海康的读码头。说说实际感受,也结合我最近做的行业调研数据。

Dynamsoft 做过一个 1710 个测试用例的基准测试,横向对比了 ZXing-Cpp、PyZBar 和 Dynamsoft 商用 SDK。

结果是这样的。

PyZBar 是开源里表现最好的,总体准确率 76.8%。ZXing-Cpp 只有 65.1%。商用方案 Dynamsoft 是 92.3%。

注意,这还只是标准测试集的数据。真实工业现场的环境更复杂,反光、模糊、变形叠加在一起,开源方案的表现还会进一步下滑。有测试数据显示,在真实生产图像上,开源方案的准确率只有 65-71%。

更扎心的是多码场景。一张图像里有 2-20 个条码的时候,ZXing-Cpp 的准确率直接掉到 23.8%。PyZBar 好一点,85%。商用方案 91.3%。物流场景里一个包裹上经常同时有面单条码、广告条码、规格码,你用开源方案,可能连该读哪个码都分不清。

ZBar,轻量,速度快,C 语言写的,集成方便。条码质量好的时候识别率不输商用方案。但碰到模糊、变形、低对比度的场景直接拉胯。有一个有意思的发现,在 Nyquist 极限附近(条码 module 小于 3 像素),OpenCV 是唯一还能勉强解码的库,但正常场景它的表现最差。

ZXing,Java 生态里最主流的方案。它的设计哲学是"视频流场景总有一帧可读"——适合零售和消费场景,不适合工业产线。实测单帧解码耗时 ZBar 大概 5-10ms,ZXing 在 20-50ms,差距明显。

Halcon,工业视觉领域老大哥。1D 码读取用的是灰度投影法,将条码区域的灰度值沿条码元素方向投影为 1D 波形,通过波峰波谷的宽度和间距解码。这种方法的数学基础很扎实,对光照变化有一定鲁棒性,但在极端反光、严重模糊或大曲率变形面前仍有局限。贵,按 license 收费,一个部署点几万块。
在这里插入图片描述

商用读码头(Datalogic 和海康的),这是另一个层面的东西了。读码头里自带光源、相机、解码芯片,拍到的图像直接在硬件里解码。速度快(含采集 <30ms),识别率高(95-99.9%),抗干扰能力强。但贵,一个读码头几千到上万。

2024 年中国读码器市场排名,Cognex 第一、基恩士第二、Datalogic 第三,海康机器人第四。海康机器人的 ID 系列价格是 Cognex 的 1/3 到 1/2,在常规场景差距已经很小,但复杂场景算法还有代际差距。

我最后的结论是,预算够直接上商用读码头,别犹豫。验证性项目或预算有限,先用 ZBar/ZXing 做原型,跑出问题再考虑 Halcon 或商用方案。不要一开始就自己造轮子,读码这个领域的轮子已经很成熟了。

05 高速场景下的频闪灯,不是随便亮一下就行的

物流传送带每秒 2 米的速度,意味着相机要在极短的曝光时间内完成拍摄。曝光时间一长,图像运动模糊,条码直接糊成一团。

怎么解决?用频闪灯。

频闪灯和普通光源不一样,它是在相机曝光的瞬间发出一个极短的高强度光脉冲,持续时间可以短到微秒级。这样即使包裹在高速运动,也能"冻结"在画面里,拍出清晰的条码图像。

Smart Vision Lights 有一款专门给物流场景做的频闪灯,叫 Lightgistics 系列。它有个挺有意思的技术叫 Hidden Strobe,频闪效果对人眼不可见,但图像采集照常工作。物流仓库里工人走来走去的,一直闪闪闪谁受得了。另外它的 Deca OverDrive 模式,脉冲亮度是普通模式的 10 倍,透明塑料膜包裹都能拍清楚。

但频闪灯的调校是个精细活。频闪的时机要和相机的曝光精确同步,早了或晚了几个微秒,图像就暗了或者还是糊的。不同相机的触发延迟不一样,你得一通道调试。

而且频闪灯的亮度也不能随便调。太亮了,白色包裹上的条码直接过曝,黑白反转,解码算法一样废。太暗了,深色包裹上的条码拍不清楚。最终你得根据现场包裹的反射率分布,找到一个折中的亮度值。

这个调参的过程,我在现场蹲了整整一天半。

06 底部线扫相机的积灰,和一面镜子

底部线扫相机是 DWS 系统里一个很容易被忽视的坑。

线扫相机安装在传送带下方,镜头朝上拍摄包裹底部的条码。这个位置决定了它是一个天然的"接灰盘"。传送带上的灰尘、纸屑、碎胶带,全部往下掉,直接落在镜头上。

线扫相机的传感器是一条窄线,镜头上哪怕有一丁点灰尘,就会在图像上产生一条贯穿全图的暗线。面阵相机灰尘影响的是局部区域,线扫相机灰尘影响的是全局。只要镜头脏了,所有图像都废了。

怎么办?两种方案。

第一种,配一个吹风清洁装置。用压缩空气持续吹镜头表面,灰尘刚落下来就被吹走。成本不高,但需要定期维护气路,压缩空气里不能有水汽,否则镜头上会结水珠,比灰尘还难搞。

第二种,也是我觉得更聪明的方案,用镜子反射。不在传送带正下方装相机,而是把一面 45 度反射镜装在传送带下方,相机装在侧面。光线通过镜子反射到相机里,灰尘落在镜面上而不是镜头上。清洁镜面比清洁镜头简单太多了,拿块布擦一下就行。而且相机在侧面,灰尘积累速度也慢得多。

这个方案我在项目后期才了解到,早知道一开始就用了。

另外底部线扫还有一个容易踩的坑。线扫相机用的是线阵传感器,拍出来的图像是一行一行拼接的。如果传送带速度不均匀,拼接出来的图像就会拉伸或压缩,条码的比例就跟着变了。这个问题我调了两天才发现,一直以为是解码算法的问题,结果根因在速度波动。

07 深度学习杀进来了,但还没到颠覆的时候

这部分是我最近做系统调研才发现的,读码领域正在经历一个有意思的变化。

传统读码的思路是,图像进来 → 找到条码区域 → 解码。整个流程里"找到条码区域"这一步,传统方法用的是图像处理(边缘检测、形态学操作、Hough 变换这些),效果有限,碰到复杂背景或条码变形就容易丢。

现在有人用深度学习来做第一步了。YOLO-Barcode 是 2024 年发表的一个模型,专门检测一维码和二维码。在 ZVZ-real 公开数据集上,F1 达到 98.6%,比前代基于语义分割的方法快 4 倍。还有 MGL-YOLO,基于 YOLOv8 轻量化改进,专为一维条码设计。

但注意,这些模型只负责"找到条码在哪里",不负责"读出条码内容"。解码还是交给传统库(OpenCV、ZBar 这些)。这就是所谓的混合架构,深度学习做定位,传统算法做解码,各取所长。

还有人搞了三级流水线,YOLO 粗定位 → SAM2 像素级精确分割 → pyzbar 解码。精度比传统矩形框裁剪更高。

去模糊方向也有进展。DeblurGAN-v2 做端到端去模糊处理,先修图再解码。Gs-DeblurGANv2 是轻量化版本,适合边缘设备。2025 年 CAIP 会议发表了面向低功耗 CPU 的实时条码分割模型,不依赖 GPU 也能跑。

最新的趋势是 AI 芯片内置化。东集 X4 搭载专用 AI 芯片,自适应曝光 + 实时畸变校正 + AI 解码一体化,延迟 <30ms。Cognex 2025 年 1 月发布的 DataMan 290/390 也主打 AI 驱动。AI 读码不再是噱头,开始成为工业标准。

我自己的看法是,如果你现在在做工业读码项目,可以关注这个方向,但别急着上。两个原因。

第一,端到端深度学习直接解码(不经过传统解码器)目前还不成熟。条码的"解码"本质上是精确测量条/空宽度或模块值,这对 DL 模型的精度要求极高,加上变长输出问题,目前还没有成熟的工业方案。混合架构(DL 定位 + 传统解码)是当前最务实的选择。

第二,商用读码器已经开始内置 AI 了。东集、Cognex 都在做。你自己搭深度学习流水线的 ROI 还不高,除非你有非常特殊的场景。

08 先解决光学问题,再调算法

这是我想跟所有做读码项目的同行说的最重要的一件事。

读码跟目标检测不一样。目标检测你还可以靠数据增强、模型迭代来提升,读码很多问题的根因在物理层面,图像没拍清楚,再强的算法也解不出来。

我总结了一个优先级顺序。

第一,先把光学搞定。偏振片消除反光,频闪灯冻结运动,同轴光源解决镜面反射,穹顶光源提供均匀漫射。这些物理手段的效果远超纯算法。

第二,把采集参数调好。曝光时间、增益、白平衡、触发同步,这些参数直接影响图像质量。在 1.5m/s 传送带速度下,一个 30cm 的包裹通过相机视野的时间只有 200ms,加上曝光、传输、解码,留给算法的时间不超过 50ms。参数没调好,后面全是白费。

第三,做好预处理。去模糊(Wiener 滤波或 DeblurGAN)、自适应阈值、畸变校正。这一步能把你从 90% 拉到 97%。

第四,才是换更好的解码库。ZBar 不行试 ZXing,ZXing 不行试 Halcon,Halcon 不行上商用读码头。

第五,深度学习作为锦上添花。YOLO 定位条码区域,传统库解码。目前这个方向还在演进中。

大多数人的做法是反过来的,上来就换算法、换库、调参数,折腾一圈下来发现读码率还是上不去。回头一看原始图像,糊的糊、白的白、变形的变形。你拿这种图像喂什么算法都白搭。

先看图像。图像质量上去了,ZBar 可能就够用了。图像质量不行,上 Halcon 也没用。

这也是读码技术 50 年演进告诉我们的那个规律,每次技术跃迁,驱动力都是新传感器,不是新算法。你的第一反应不应该是"训练一个更好的模型",而应该是"换一个光源、加一片偏振片、调一下曝光"。


作者:头帕王子
系列专栏:工业视觉踩坑实录
如果觉得有用,点赞关注不迷路 👋

如果你也在做类似的工业视觉项目,希望这篇文章能帮你少走些弯路。有问题欢迎留言或加我好友讨论。


📎 相关专栏

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐