2. 二维码结构与原理:从版本到模块,一图读懂

二维码这东西,每天扫了无数次,但真正把它结构拆开看,很多人反而懵了。我刚开始做工业视觉的时候也这样,觉得二维码不就是黑白方块嘛,后来在产线上吃了亏才明白——不懂结构,打标质量根本无从谈起。

说白了,二维码的每一个黑格、每一条空白都有它的使命。版本决定容量,纠错等级决定抗脏污能力,定位图案是扫码器的"导航仪"……这些概念串起来,就是一张完整的知识网。下面这张图把核心概念的关系先捋一遍,后面我们再逐个拆解。

二维码结构知识体系 二维码结构与原理 编码参数 物理结构 数据承载 版本 (1-40) 纠错等级 (L/M/Q/H) 定位图案 空白区 模块尺寸 数据区域 纠错码区域与数据区域 共同构成数据承载

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,结果数据量超了,硬塞进去扫码器死活不认。

我个人的习惯:先算数据量,再定版本。别一上来就拍脑袋选 Version 2 或 Version 3。数据量少就用小版本,还能留出空白区的余量。

2.2 纠错等级——容错能力的四个挡位

二维码为什么能在脏污、破损的情况下还能扫出来?靠的就是纠错码。纠错等级分四挡:

等级 纠错能力 约可恢复数据 适用场景
L 约 7% 少量污损 洁净环境、纸质标签
M 约 15% 中等污损 一般工业场景
Q 约 25% 较大面积污损 金属打标、曲面零件
H 约 30% 严重污损 恶劣环境、高可靠性需求

我建议在工业视觉检测中,至少选 Q 级。 产线上粉尘、油污、划痕都常见,用 L 级或 M 级很可能一天到晚误码报警。当然,纠错等级越高,数据容量越小——这是要权衡的。

我曾经踩过的一个坑:有个项目选了 H 级纠错,觉得"越高越好"。结果二维码模块数量暴增,打标机频率跟不上,打出来的边缘模糊。后来换回 Q 级,反而良率上去了。纠错等级不是越高越好,够用就行。

2.3 定位图案——二维码的"导航系统"

定位图案分三种,各司其职:

  • Finder Pattern(寻像图形):三个角上的回形黑白相间图案。扫码器靠它快速定位二维码的位置和方向。注意是三个角,不是四个——右下角没有,因为要留空间给数据。
  • Timing Pattern(时序图形):一行一列交替的黑白模块,贯穿整个二维码。它告诉扫码器"模块的间距是多少"。产线上如果打标拉伸变形,Timing Pattern 能辅助校正。
  • Alignment Pattern(校正图形):版本 2 及以上才有。分布在二维码内部,用于辅助校正畸变。版本越高,Alignment Pattern 数量越多。

你想想看,如果定位图案被遮挡或者打印质量差,扫码器连"这是二维码"都认不出来,更别提读数据了。所以打标时一定要保证这三个区域清晰、对比度高。

2.4 空白区——守好边界

空白区(Quiet Zone)是二维码四周的纯色边框,宽度至少 4 个模块。它的作用就是告诉扫码器"二维码到这里结束了,外面是背景"。

很多人不重视空白区,觉得"多打几个模块又不会死"。但我告诉你,空白区不够,扫码器会把背景的纹理误认为数据模块,导致解码失败。

我遇到过的一个真实案例:客户在金属件上激光打标,二维码本身打得很好,但空白区只有 2 个模块宽。结果扫码器时灵时不灵,换了好几个牌子的扫码器都没用。最后把打标区域整体缩小一圈,留出 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 等分割成若干个块。扫码器按照固定的掩模规则去读取这些块,然后还原成二进制数据。

这里有个容易忽略的点:数据区域和纠错码区域是交织在一起的。并不是前面一大块是数据、后面一大块是纠错码,而是按块交替排列。这样做的好处是——如果某个区域被污损了,纠错码分布在各个块里,能更均匀地恢复数据。

一句话总结核心:

  • 版本决定二维码的"骨架"大小
  • 纠错等级决定抗污损能力
  • 定位图案负责"我在哪、怎么读"
  • 空白区保证扫码器不被干扰
  • 模块尺寸决定打标是否"看得清"
  • 数据区域负责"装内容"

这六点,哪一个出问题,二维码就打不好、扫不出。