2. 二维码结构与原理:从版本到模块,一图读懂
二维码这东西,每天扫了无数次,但真正把它结构拆开看,很多人反而懵了。我刚开始做工业视觉的时候也这样,觉得二维码不就是黑白方块嘛,后来在产线上吃了亏才明白——不懂结构,打标质量根本无从谈起。
说白了,二维码的每一个黑格、每一条空白都有它的使命。版本决定容量,纠错等级决定抗脏污能力,定位图案是扫码器的"导航仪"……这些概念串起来,就是一张完整的知识网。下面这张图把核心概念的关系先捋一遍,后面我们再逐个拆解。
2.1 版本——二维码的"尺码"
版本说白了就是二维码的尺寸规格。从 Version 1 到 Version 40,共 40 个版本。Version 1 是 21×21 个模块,每增加一个版本,每边加 4 个模块——Version 2 是 25×25,Version 3 是 29×29,以此类推,到 Version 40 是 177×177。
版本越高,能装的数据就越多。但这不是无代价的——版本越高,二维码的物理尺寸就越大,或者模块尺寸就越小。我在项目里见过有人为了把二维码塞进一个 5mm×5mm 的零件上,选了 Version 1,结果数据量超了,硬塞进去扫码器死活不认。
2.2 纠错等级——容错能力的四个挡位
二维码为什么能在脏污、破损的情况下还能扫出来?靠的就是纠错码。纠错等级分四挡:
| 等级 | 纠错能力 | 约可恢复数据 | 适用场景 |
|---|---|---|---|
| L | 约 7% | 少量污损 | 洁净环境、纸质标签 |
| M | 约 15% | 中等污损 | 一般工业场景 |
| Q | 约 25% | 较大面积污损 | 金属打标、曲面零件 |
| H | 约 30% | 严重污损 | 恶劣环境、高可靠性需求 |
我建议在工业视觉检测中,至少选 Q 级。 产线上粉尘、油污、划痕都常见,用 L 级或 M 级很可能一天到晚误码报警。当然,纠错等级越高,数据容量越小——这是要权衡的。
2.3 定位图案——二维码的"导航系统"
定位图案分三种,各司其职:
- Finder Pattern(寻像图形):三个角上的回形黑白相间图案。扫码器靠它快速定位二维码的位置和方向。注意是三个角,不是四个——右下角没有,因为要留空间给数据。
- Timing Pattern(时序图形):一行一列交替的黑白模块,贯穿整个二维码。它告诉扫码器"模块的间距是多少"。产线上如果打标拉伸变形,Timing Pattern 能辅助校正。
- Alignment Pattern(校正图形):版本 2 及以上才有。分布在二维码内部,用于辅助校正畸变。版本越高,Alignment Pattern 数量越多。
你想想看,如果定位图案被遮挡或者打印质量差,扫码器连"这是二维码"都认不出来,更别提读数据了。所以打标时一定要保证这三个区域清晰、对比度高。
2.4 空白区——守好边界
空白区(Quiet Zone)是二维码四周的纯色边框,宽度至少 4 个模块。它的作用就是告诉扫码器"二维码到这里结束了,外面是背景"。
很多人不重视空白区,觉得"多打几个模块又不会死"。但我告诉你,空白区不够,扫码器会把背景的纹理误认为数据模块,导致解码失败。
2.5 模块尺寸——打标精度的第一道关口
模块尺寸就是每个小方块的物理宽度。举个例子:一个 Version 1 的二维码是 21×21 模块,如果你打标区域是 10mm×10mm,那模块尺寸就是 10 ÷ 21 ≈ 0.476mm。
模块尺寸不能太小,否则扫码器分辨不了。一般工业场景建议模块尺寸 ≥ 0.25mm。当然这也取决于打标设备和扫码器的分辨率。
我个人的经验是:模块尺寸 × 扫码器分辨率 ≥ 3 个像素。如果扫码器是 640×480 的视野,对应到模块上至少要有 3 个像素宽,才能稳定识别。
2.6 数据区域——真正承载信息的地方
数据区域就是二维码里除了定位图案、纠错码、版本信息等之外,真正存放你的数据(比如产品 ID、批次号)的地方。它由一个个模块组成,每个模块代表一个 bit——黑为 1,白为 0。
数据区域并不是连续的方块,而是被定位图案、纠错码、Timing Pattern 等分割成若干个块。扫码器按照固定的掩模规则去读取这些块,然后还原成二进制数据。
这里有个容易忽略的点:数据区域和纠错码区域是交织在一起的。并不是前面一大块是数据、后面一大块是纠错码,而是按块交替排列。这样做的好处是——如果某个区域被污损了,纠错码分布在各个块里,能更均匀地恢复数据。
一句话总结核心:
- 版本决定二维码的"骨架"大小
- 纠错等级决定抗污损能力
- 定位图案负责"我在哪、怎么读"
- 空白区保证扫码器不被干扰
- 模块尺寸决定打标是否"看得清"
- 数据区域负责"装内容"
这六点,哪一个出问题,二维码就打不好、扫不出。