概述

Data Matrix二维码由美国国际资料公司(International Data Matrix)于1989年发明,是一种由黑色、白色的色块以正方形或长方形组成的二维码,其发展构想是希望在较小的标签上存储更多的信息量。DM码的最小尺寸是目前所有条码中最小的,特别适合于小零件的的标识,直接印刷在实体上,被广泛应用在电路、药品等小件物品以及制造业的流水线生产过程。
在这里插入图片描述
旧版的 Data Matrix 码包括 ECC000、ECC050、ECC080、ECC100 和 ECC140,而ECC200 是最新的 Data Matrix码版本,两者最大差别在于模块数目。旧版本的模块为奇数,而新版本的模块为偶数。相比而言,ECC200容错能力较强,更为常见,以下所说的Data Matrix二维码特指ECC200。
在这里插入图片描述

Data Matrix 码结构

Data Matrix码由数据区、寻边区(finder pattern)和空白区(quiet zone)组成。数据区包含着编码信息,包括数字、字母和汉字等按照一定的编码规则生成。每个相同大小的黑色和白色方格称为一个数据单元,分别代表二进制的1和0。寻边区包括L型的实心定位标识和反L型的虚线时钟标识。L型实心定位标识主要用于限定DM码的物理尺寸、定位和符号失真。反L型虚线边界主要用于限定单元结构,但也能帮助确定物理尺寸及失真。条码读取器通过对定位标识与时钟标识进行图像处理来检测位置,可进行 360° 全方位读取。寻边区外层为空白区,宽度至少为1个数据单元。
在这里插入图片描述DM码总共有24种尺寸规格,最小尺寸为10×10模块,最大尺寸为144×144模块。当模块数目超过26×26时将进行分区块,每个区块不会超过26个模块。此结构可防止失真。

符号尺寸区块数据单元
10×10 至 26×2618×8 至 24×24
28×28 至 52×52414×14 至 24×24
64×64 至 104×1041614×14 至 24×24
120×120 至 144×1443618×18 至 22×22

Data Matrix 码的实际尺寸的计算方法为符号尺寸乘以模块的可印刷尺寸。
例如单元尺寸为 0.25 mm,
符号尺寸:10 × 10 模块 = 2.5 × 2.5 mm
符号尺寸:32 × 32 模块 = 8.0 × 8.0 mm
符号尺寸:8 × 18 模块 = 2.0 × 4.5 mm

编码规则

DM码数据区由相同大小的黑白格子组成,分别代表二进制的1和0,以二维元码(binary code)方式进行编码,计算机可直接读取其数据信息。最常见的编码模式采用ASCII方式,每个编码单元有8位,代表一个字节。8个方格组成L型方格阵。

如下图DM码编码的信息为“Wikipedia”,从数据区左上角第5行第1列开始编码,位于中间区域的编码单元都为标准L型,但位于边缘区域的编码单元被分为多个部分,比如首字母W,部分在左边缘,剩余的部分位于对应右边缘。两部分合起来组成标准L型编码单元。
在这里插入图片描述另外,在角落中的编码单元可能组成不同的形状(非L型)
在这里插入图片描述
除了上述ASCII编码方式,DM编码还提供了Text、C40、X12、EDIFACT和Base256模式。

编码模式字符集每字符数据位数
ASCII数字成对编码 4
ASCII 0-1278
扩展ASCII 128-25516
C40主要为大写字母和数字5.33
Text主要为小写字母和数字5.33
X12ANSI X12 EDI 数据集5.33
EDIFACTASCII 32-946
Base 2560-255 范围的任何数据8

不同编码模式可以通过编码值大小进行切换,默认编码模式为ASCII(非扩展),编码值在1~128内,当编码值大于128时,将切换到其他编码模式,比如编码值为230代表后续编码切换到C40编码模式。

CodewordInterpretationCodewordInterpretation
0Not used1–128ASCII data (ASCII value + 1)
129End of message130–229Digit pairs 00 – 99
230Begin C40 encoding231Begin Base 256 encoding
232FNC1(GS1标准规格)233Structured append. Allows a message to be split across multiple symbols.
234Reader programming235Upper Shift - Set high bit of the following character
23605 Macro23706 Macro
238Begin ANSI X12 encoding239Begin Text encoding
240Begin EDIFACT encoding241Extended Channel Interpretation code
242–255Not used

C40、Text和X12编码模式存储文字信息更为节约,将字符编码范围约束在0~39,三个字符组合有403=64000种,通过两个字节便可完成编码(2562= 65536)
V = C 1 × 1600 + C 2 × 40 + C 3 + 1 V = C1×1600 + C2×40 + C3 + 1 V=C1×1600+C2×40+C3+1
B 1 = f l o o r ( V / 256 ) B1 = floor(V/256) B1=floor(V/256)
B 2 = V m o d 256 B2 = V mod 256 B2=Vmod256
其中,C1,C2和C3为编码前的字符,B1和B2编码后的字节表示。单个字符编码占据2*8/3=5.33位,B1字节的结果值范围为0~249。当该值设置为254时,编码模式换回ASCII方式。详细编码方式参考【Wiki】Data Matrix

纠错能力

Data Matrix码在一部分损坏时也能够自动纠错而不会丢失数据。如下图,即使二维码出现脏污或部分缺失,仍能正确识别。因而DM码很适合应用在条码容易受损的场景,比如印在暴露在高热、化学清洁剂、机械剥蚀等特殊环境的零件上。
在这里插入图片描述DM码的纠错复原能力源于数据冗余技术,通过对数据增加冗余部分来保证当数据丢失时能够一定程度上进行恢复。如下图所示,DM码绿色方格代表原始数据,红色代表冗余数据。
在这里插入图片描述通常的冗余备份机制有两类:一类是完全的数据备份机制,即镜像方法,另一类为纠删码(erasure code)的方法。镜像方法又称为多副本技术,就是把数据复制成多个副本分别存储起来,以实现冗余备份,这种备份方法不涉及专门的编码和重构算法,容错性能好,但存储利用率低,当存放N个副本时,磁盘利用率仅为1/N。纠删码技术主要通过利用纠删算法将原始数据进行编码得到冗余,并将数据和冗余一并存储起来,以达容错的目的。
DM码采用Reed-Solomon编码(里德-所罗门编码)纠错技术,其基本思想给定n个原始数据块(D1,D2,D3,…,Dn),RS编码根据这n个数据块计算生成m个冗余元素(校验块C1,C2,…,Cm)。从这m+n个数据块中任取n个数据块均能解码出原始数据块,即对于n个数据进行RS编码后生成n+m个数据,能够容忍丢失至多m个数据。
实现的功能听上去很强大,其实现原理却十分简单,其很巧妙地运用了矩阵运算的特点。对于需要进行冗余处理的n个原始数据,写成列向量形式(D),左边生成一个变换矩阵,这个矩阵由n+m行和n列组成,其中上面的n×n的部分是一个单元矩阵,保证原数据在编码后不发生变化,下面的m×n的部分是一个范德蒙矩阵,生成冗余纠错数据。使用范德蒙矩阵是为了保证这个矩阵任取n×n都部分可逆。
在这里插入图片描述假设丢失了m个数据(包括原始数据和纠错数据),比如下图中D1、D4和C2丢失,需要从剩余的n个数据中恢复出原始数据D1 - Dn。从编码矩阵B中删除丢失数据和丢失编码对应行,将剩余的数据挑出来得到新n×n的矩阵B’。因为编码矩阵B的任意n行组成的矩阵都可逆,所以根据剩余的有效数据矩阵,即可把中间原始数据矩阵D解出来了。
在这里插入图片描述上面的方法理论上能够做到数据冗余处理,不过由于作为一种编码技术,RS编码需要处理的是特定长度的二进制数据,然而求矩阵逆的过程是在实数域中进行的。显然特定长度的二进制是无法准确描述实数的。因此如何构造编码矩阵B成为关键。为了解决这个问题,RS的计算域采用能够用二进制精确编码的伽罗华域GF(2n)(有限域)。与平时熟知的自然域不同,在这个域里会有自己特有的加减乘除等算术规则,是基于多项式运算的,更多参考伽罗华域(Galois Field)上的四则运算。这个域的特性就是非常适合处理[0-2n)范围内数据的四则运算,而且这里的四则运算大都通过位运算处理,效率比较高。实际为了加快计算的过程,通常采用离散傅里叶变换及其逆变换来进行编码实现基于伽罗华域傅里叶变换的RS码识别方法。详细计算参考 ECC之Reed-Solomon算法

二维码识别

工业应用读码拍照,如果是丝印喷码,常见的白底黑码、或白码黑底,使用条形光源、环形光源等,都可以得到比较好的效果。而如果是在一些玻璃上激光打码,则建议使用同轴光源或高角度的环形光源。对于这种读码的应用,分辨率不需要太高。太高的分辨率,反而不一定能读取到码了。所以考虑使用30万~130万的工业相机即可。
在这里插入图片描述

图像处理方法

一般来说,从摄像头或者扫描仪获得的DM码图像通常会包含较多噪声,且存在角度的倾斜和几何失真等问题,二维码图像识别主要包括图像预处理、条码定位和解码识别。
在这里插入图片描述由于受实际环境中图像采集设备等影响,捕获的图像通常含有较多的噪声和失真,导致不能译码或者错误译码。为了提高二维码识别的可靠性,必须对图像进行有效的预处理。预处理首先对采集的彩色图像灰度化,在灰度图上图像滤波去噪,二值化图像,进行边缘提取。图像的二值化无通用方法,大部分DM解码器时利用Ostu法等进行处理。
DM码可能占据图片中很大区域或者只占据小部分,因此快速有效地定位出条码区域是区分识别算法优劣的关键。利用DM码外部轮廓为矩形的特点,对图像进行矩形检测,可在图像中初步定位出条码位置。DM精确定位主要通过寻边区L型实线特征实现,采用遍历搜索方法,具体实现方法参考DataMatrix二维条形码解码器图像预处理研究。另一种方法利用距离为角度函数对条码边界进行标记,获取边界的位置和旋转角度。最后利用获取到的角度对条码进行仿射变换,将条码旋转到正方位置,进而进行条码解码,获取条码包含的数据信息。
定位后的DM码进行图像取样,根据采样网格将将深浅模块转换为“1”和“0”矩阵;去除探测图形,提取出数据区,并得到条码尺寸和版本信息;调用模块放置矩阵恢复正确顺序的码字流;再确定数据码字和纠错码字,并进行条码数据的检错纠错;最终恢复原始数据,正确解码输出。

基于开源库实现

Data Matrix核心库为libdmtx和Zxing
libdmtx采用的是遍历方法进行DM码区域检测及定位,至于里面的L形线检测,也都是遍历和邻域检测的,因为有有效的数据结构和网格划分,速度还是可以的。参考 datamatrix二维码开源解码库libdmtx的原理?
解码流程:创建图像>创建解码器>寻找DM区域>DM解码
libdmtx库用到4个主要的结构:

  • DmtxImage 保存着图像的属性以及一个指向像素数据的指针,这些像素数据保存在调用的程序里。
  • DmtxDecode 保存着控制解码行为和跟踪扫描过程的数值。当扫描一张新的图像,调用的程序需要每次重新创建新的DmtxDecode结构,而不是重用旧的结构。
  • DmtxRegion 以像素坐标定义了一个4边形的区域。区域可以从几乎任何方向获得,而且它们的拐角并不需要形成正确的角度。libdmtx 用它自己的结构来保存潜在条码的位置,程序调用方每调用一次获得一个位置。
  • DmtxMessage 保存着从条码提取出的解码信息。一个成功解码的区域将精确地产生一个的信息。
    具体实现参考二维码Data Matrix简介及在VS2010中的编译

参考资料

什么是 Data Matrix 码?
DATA MATRIX BARCODE
【Wiki】Data Matrix
Datamatrix Generator
纠删码(Erasure Code)浅析
Reed-Solomon纠删码简析
Erasure Codes for Storage Applications
ECC之Reed-Solomon算法
DataMatrix二维条形码解码器图像预处理研究
二维码Data Matrix简介及在VS2010中的编译

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐