精华内容
参与话题
问答
  • DataMatrix 编码生成和译码原理即方法

    万次阅读 2015-05-22 12:40:16
    ===================================================== 非常感谢博主pooran 转载自:... ==============================================================
     
    =====================================================
    非常感谢博主pooran
    转载自:http://blog.sina.com.cn/s/articlelist_1165156174_0_1.html
    ===============================================================
    DataMatrix编码的第一步骤,需要将原始信息转换成DataMatrix的码字,生成的码字范围(0,255)即unsigned char。通常的编码方式为Ascii编码,将原始字符+1即生成码字;同时为了压缩码长,若其中含有连续的两位数字,则将其+130后,生成一个unsigned char。如果要进一步压缩码长,还可以混合其他的编码方式:

        当混入其他方式的编码时,需先插入一个切换字符,如由Ascii切换至C40,则插入230,再切换回Ascii时,则插入254。

        编码时,逐一对原始字符进行转换,如以下字符串:ABCDE12,转换后生成码字为:66 67 68 69 70 142。码长为6。

        根据码长,查下表规则,确定最终的码长:选择12*12的那一行,其码长为8。由于8-6=2,所以仍需插入2个码字,将其填满(避免生成的二维码出现大面积空白区域)。
    ECC200的编码规则如下表:


        计算此2码字:第一个码字为129(填充字符end of message),后面的各位为伪随机码,计算方法为253状态随机算法。公式:pseudorandom(n) = (149 × n) mod 253 + 1,其中n为当前码字的位置(此时=8),pseudorandom+129(mod 254)为最终码字。故转换后最终码字为:66 67 68 69 70 142 129 56 。

    ----------------------------------------------------------------------------

    伽罗华域即有限域,RS编码在此域中进行运算,故不得不对其有所了解。DataMatrix的数据码字、及纠正码字等均是属于GF(2^8)中的符号,其空间大小为256。有限域的一个特征是,其符号(元素)运算的结果,仍属于该域。除了0、1外,另外254个符号,均由本原多项式P(x)生成,DataMatrix规则中,P(x)=x^8+x^5+x^3+x^2+1,设α为P(x)的根,α^8+α^5+α^3+α^2+1=0,由于伽罗华域的加法为异或算法,故α^8=α^5+α^3+α^2+1。
        GF(2^8)符号的表示形式如下:

     

    多项式

    D7D6D5D4 D3D2D1D0

    数值表示

    0

    0

    0000 0000

    0

    α^0

    α^0

    0000 0001

    1

    α^1

    α^1

    0000 0010

    2

    α^2

    α^2

    0000 0100

    4

    α^3

    α^3

    0000 1000

    8

    α^4

    α^4

    0001 0000

    16

    α^5

    α^5

    0010 0000

    32

    α^6

    α^6

    0100 0000

    64

    α^7

    α^7

    1000 0000

    128

    α^8

    α^5+α^3+α^2+1

    0010 1101

    45

    α^9

    α^6+α^4+α^3+α

    0101 1010

    90

    α^10

    α^7+α^5+α^4+α^2

    1011 0100

    180

    α^11

    α^6+α^2+1

    0100 0101

    69

    α^12

    α^7+α^3+α

    1000 1010

    138

    α^13

    α^5+α^4+α^3+1

    0011 1001

    57

    α^14

    α^6+α^5+α^4+α

    0111 0010

    114

    …… ……

         计算机运算时,需要用相关算法将整个GF的所有符号的数值表示列表出来,结果如下:
    alphaTo=
        {  1,   2,   4,   8,  16,  32,  64, 128,  45,  90, 180,  69, 138,  57, 114, 228,
         229, 231, 227, 235, 251, 219, 155,  27,  54, 108, 216, 157,  23,  46,  92, 184,
          93, 186,  89, 178,  73, 146,   9,  18,  36,  72, 144,  13,  26,  52, 104, 208,
         141,  55, 110, 220, 149,   7,  14,  28,  56, 112, 224, 237, 247, 195, 171, 123,
         246, 193, 175, 115, 230, 225, 239, 243, 203, 187,  91, 182,  65, 130,  41,  82,
         164, 101, 202, 185,  95, 190,  81, 162, 105, 210, 137,  63, 126, 252, 213, 135,
          35,  70, 140,  53, 106, 212, 133,  39,  78, 156,  21,  42,  84, 168, 125, 250,
         217, 159,  19,  38,  76, 152,  29,  58, 116, 232, 253, 215, 131,  43,  86, 172,
         117, 234, 249, 223, 147,  11,  22,  44,  88, 176,  77, 154,  25,  50, 100, 200,
         189,  87, 174, 113, 226, 233, 255, 211, 139,  59, 118, 236, 245, 199, 163, 107,
         214, 129,  47,  94, 188,  85, 170, 121, 242, 201, 191,  83, 166,  97, 194, 169,
         127, 254, 209, 143,  51, 102, 204, 181,  71, 142,  49,  98, 196, 165, 103, 206,
         177,  79, 158,  17,  34,  68, 136,  61, 122, 244, 197, 167,  99, 198, 161, 111,
         222, 145,  15,  30,  60, 120, 240, 205, 183,  67, 134,  33,  66, 132,  37,  74,
         148,   5,  10,  20,  40,  80, 160, 109, 218, 153,  31,  62, 124, 248, 221, 151,
           3,   6,  12,  24,  48,  96, 192, 173, 119, 238, 241, 207, 179,  75, 150,   0 }
    同时,将各符号的指数也列表出来:
    expOf=
       { 255,   0,   1, 240,   2, 225, 241,  53,   3,  38, 226, 133, 242,  43,  54, 210,
           4, 195,  39, 114, 227, 106, 134,  28, 243, 140,  44,  23,  55, 118, 211, 234,
           5, 219, 196,  96,  40, 222, 115, 103, 228,  78, 107, 125, 135,   8,  29, 162,
         244, 186, 141, 180,  45,  99,  24,  49,  56,  13, 119, 153, 212, 199, 235,  91,
           6,  76, 220, 217, 197,  11,  97, 184,  41,  36, 223, 253, 116, 138, 104, 193,
         229,  86,  79, 171, 108, 165, 126, 145, 136,  34,   9,  74,  30,  32, 163,  84,
       
    展开全文
  • DataMatrix码的生成

    2019-06-27 17:46:54
    通过调用dll文件,生成DM码,并通过图片显示DM码;适合初级研究;
  • Data Matrix

    千次阅读 2015-01-06 18:06:11
    Data Matrix原名Data code,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明。Data Matrix又可分为ECC000-140与ECC200两种类型,ECC000-140具有多种不同等级的错误纠正功能,而ECC200则...

    定义

    Data Matrix原名Data code,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明。Data Matrix又可分为ECC000-140与ECC200两种类型,ECC000-140具有多种不同等级的错误纠正功能,而ECC200则透过Reed-Solomon演算法产生多项式计算出错误纠正码,其尺寸可以依需求印成不同大小,但采用的错误纠正码应与尺寸配合,由于其演算法较为容易,且尺寸较有弹性,故一般以ECC200较为普遍。
    编码内容:Data Matrix

    特点

    Data Matrix二维条码的外观是一个由许多小方格所组成的正方形或长方形符号,其资讯的储存是以浅色与深色方格的排列组合,以二位元码(Binary-code)方式来编码,故电脑可直接读取其资料内容,而不需要如传统一维条码的符号对映表(Character Look-up Table)。深色代表“1”,浅色代表“0”,再利用成串(String)的浅色与深色方格来描述特殊的字元资讯,这些字串再列成一个完成的矩阵式码,形成Data Matrix二维条码码,再以不同的印表机印在不同材质表面上。由于Data Matrix二维条码只需要读取资料的20%即可精确辨读,因此很适合应用在条码容易受损的场所,例如印在暴露于高热、化学清洁剂、机械剥蚀等特殊环境的零件上。
    Data Matrix二维条码的尺寸可任意调整,最大可到14平方英寸,最小可到0.0002平方英寸,这个尺寸也是目前一维与二维条码中最小的。另一方面,大多数的条码的大小与编入的资料量有绝对的关系,但是Data Matrix二维条码的尺寸与其编入的资料量却是相互独立的,因此它的尺寸比较有弹性。此外Data Matrix二维条码码还具有以下特性:
    1.可编码字元集包括全部的ASCII字元及扩充ASCII字元,共256个字元。
    2.条码大小(不包括空白区):10×10 ~ 144×144
    3.资料容量:2235个文数字资料,1556个8位元资料,3116个数字资料。 
    4.错误纠正:透过Reed-Solomon演算法产生多项式计算获得错误纠正码。不同尺寸宜采用不同数量的错误纠正码。

    定位图形

    定位图形是资料区域的一个周界,为一个模组宽度。其中两条邻边为暗实线,主要用于限定物理尺寸;定位和符号失真。另两条邻边由交替的深色和浅色模组组成,主要用于限定符号的单元结构,但也能帮助确定物理尺寸及失真。

    符号尺寸

    ECC000-140符号有奇数行与奇数列。符号外观为一方形矩阵,尺寸从9×9至49×49,不包括空白区。这些符号可透过右上角深色方格识别出来。
    ECC200符号有偶数行与偶数列。有些符号是正方形,尺寸从10×10至144×144,不包括空白区。有些是长方形,尺寸从8×18至16×48,不包括空白区。所有的ECC200符号都可以透过右上角浅色方格识别出来。

    资料表示方法

    Data Matrix二维条码按以下步骤来表示资料:
    资料编码
    先分析要表示的资料,选取合适的编码方案,按所选定的方案将资料流转为字码流,并加入必要的填字,如果使用者未规定矩阵寸,则应选取能满足要存放资料的最小尺寸。DataMatrix二维条码共有6种编码方案,即6种字码集,见下表。
    编码模式
    字符集
    每字符数据位数
    ASCII
    数字成对编码
    4
    ASCII 0-127
    8
    扩展ASCII 128-255
    16
    C40
    大写字母和数字
    5.33
    Text
    小写字母和数字
    5.33
    X12
    ANSI X12 EDI 数据集
    5.33
    EDIFACT
    ASCII 32-94
    6
    Base 256
    0-255 范围的任何数据
    8
    错误检测和纠正字码(ECC)的产生:
    对少于255个字码的Data Matrix二维条码,错误纠正字码可由资料字码计算得出。对于多于255个字码的符号,应将资料字码分成多个模组,然後再产生每一个模组的错误纠正字码。错误纠正字码能够纠正两种类误字码,包括E错误(已知位置上的错误字码),以及T错误(未知位置上的错误字码)。换句话说,E错误是不能被扫瞄或不能被解码的符号字元,T错误则是被错误解码的符号字元。
    Data Matrix 包括ECC 000-140 和ECC 200 两套符号体系,ISO 标准推荐在公共场合使用ECC 200 规范。下面给出ECC 200 的相关技术规格和性能。

    符号尺寸、容量和纠错性能一览表

    符号尺寸
    数据容量
    纠错性能
    行数
    列数
    数字
    数字字母
    字节数据
    纠错率%
    错误/擦除
    10
    10
    6
    3
    1
    62.5
    2/
    12
    12
    10
    6
    3
    58.3
    3/
    14
    14
    16
    10
    6
    55.6
    5/7
    16
    16
    24
    16
    10
    50
    6/9
    18
    18
    36
    25
    16
    43.8
    7/11
    20
    20
    44
    31
    20
    45
    9/15
    22
    22
    60
    43
    28
    40
    10/17
    24
    24
    72
    52
    34
    40
    12/21
    26
    26
    88
    64
    42
    38.9
    14/25
    32
    32
    124
    91
    60
    36.7
    18/33
    36
    36
    172
    127
    84
    32.8
    21/39
    40
    40
    228
    169
    112
    29.6
    24/45
    44
    44
    288
    214
    142
    28
    28/53
    48
    48
    348
    259
    172
    28.1
    34/65
    52
    52
    408
    304
    202
    29.2
    42/78
    64
    64
    560
    418
    278
    28.6
    56/106
    72
    72
    736
    550
    366
    28.1
    72/132
    80
    80
    912
    682
    454
    29.6
    96/180
    88
    88
    1152
    862
    457
    28
    112/212
    96
    96
    1392
    1042
    694
    28.1
    136/260
    104
    104
    1632
    1222
    814
    29.2
    168/318
    120
    120
    2100
    1573
    1048
    28
    204/390
    132
    132
    2608
    1954
    1302
    27.6
    248/472
    144
    144
    3116
    2335
    1556
    28.5
    310/590
    矩形符号
    8
    18
    10
    6
    3
    58.3
    3/
    8
    32
    20
    13
    8
    52.4
    5/
    12
    26
    32
    22
    14
    46.7
    7/11
    12
    36
    44
    31
    20
    45.0
    9/15
    16
    36
    64
    46
    30
    42.9
    12/21
    16
    48
    98
    72
    47
    36.4
    14/25

    展开全文
  • python生成DataMatrix码(DataMatrix

    千次阅读 2015-03-24 09:33:52
    #-*- encoding: utf-8 -*...from elaphe.datamatrix import DataMatrix import os import pygame import sys from pygame.locals import * from PIL import Image,ImageDraw,ImageFont reload(sys) sys.set...
    #-*- encoding: utf-8 -*-
    from elaphe.datamatrix import DataMatrix
    import os
    import pygame
    import sys
    from pygame.locals import *
    from PIL import Image,ImageDraw,ImageFont

    reload(sys)
    sys.setdefaultencoding("utf-8")

    #1 生成DataMatrix的条码图片
    bc = DataMatrix()
    text = '068080835AD000D10701014111'.upper()
    img = bc.render(text, options=dict(rows=32, columns=32))
    #img.save(text+'.png', 'png')

    #2 生成描述性文字图片
    #3 合成为一个新的图片,即最终包含说明的,符合菲亚特规范PDF147的条码图片

    base = Image.open("datamatrix_big_32_32.png")
    base_w, base_h = base.size
    tmp = img#Image.open(text+'_tmp.png')
    tmp_w, tmp_h = tmp.size
    tmp = tmp.resize((tmp_w, tmp_h), Image.ANTIALIAS)
    b_w = int((base_w - tmp_w) / 2) - 90
    b_h = int((base_h - tmp_h) / 2)
    tmp = tmp.convert("RGBA")
    base.paste(tmp, (b_w, b_h), tmp)


    font = ImageFont.truetype('simsun.ttc',12)
    draw = ImageDraw.Draw(base)
    draw.text((base_w/2-len(text) - 25,4), '0-68080835AD',(0,0,0),font=font)
    draw.text((base_w/2-len(text) - 25,22), '000-D1',(0,0,0),font=font)
    draw.text((base_w/2-len(text) - 25,40), '07010',(0,0,0),font=font)
    draw.text((base_w/2-len(text) - 25,58), '1-4111',(0,0,0),font=font)
    content = "P68080835AD T07D1111407010 20150321113322 188007"
    draw.text((base_w/2-len(text) + 55,4), 'P68080835AD',(0,0,0),font=font)
    draw.text((base_w/2-len(text) + 55,22), 'T07D1111407010',(0,0,0),font=font)
    draw.text((base_w/2-len(text) + 55,40), '21/03/2015 16:42',(0,0,0),font=font)
    draw.text((base_w/2-len(text) + 55,58), '188007',(0,0,0),font=font)

    base.save(text+".png")
    展开全文
  • DataMatrixDemo

    2018-01-13 16:58:18
    这是一个用qt C++做的生成DataMatrix Code的Demo,二维码的实现主要基于libdmtx-0.7.4标准库,支持中文
  • Data Matrix二维码由美国国际资料公司(International Data Matrix)于1989年发明,是一种由黑色、白色的色块以正方形或长方形组成的二维码,其发展构想是希望在较小的标签上存储更多的信息量。DM码适合于小零件的的...

    概述

    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×26 1 8×8 至 24×24
    28×28 至 52×52 4 14×14 至 24×24
    64×64 至 104×104 16 14×14 至 24×24
    120×120 至 144×144 36 18×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-127 8
    扩展ASCII 128-255 16
    C40 主要为大写字母和数字 5.33
    Text 主要为小写字母和数字 5.33
    X12 ANSI X12 EDI 数据集 5.33
    EDIFACT ASCII 32-94 6
    Base 256 0-255 范围的任何数据 8

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

    Codeword Interpretation Codeword Interpretation
    0 Not used 1–128 ASCII data (ASCII value + 1)
    129 End of message 130–229 Digit pairs 00 – 99
    230 Begin C40 encoding 231 Begin Base 256 encoding
    232 FNC1(GS1标准规格) 233 Structured append. Allows a message to be split across multiple symbols.
    234 Reader programming 235 Upper Shift - Set high bit of the following character
    236 05 Macro 237 06 Macro
    238 Begin ANSI X12 encoding 239 Begin Text encoding
    240 Begin EDIFACT encoding 241 Extended Channel Interpretation code
    242–255 Not used

    C40、Text和X12编码模式存储文字信息更为节约,将字符编码范围约束在0~39,三个字符组合有403=64000种,通过两个字节便可完成编码(2562= 65536)
    V=C1×1600+C2×40+C3+1V = C1×1600 + C2×40 + C3 + 1
    B1=floor(V/256)B1 = floor(V/256)
    B2=Vmod256B2 = V mod 256
    其中,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中的编译

    展开全文
  • Data Matrix二维码图像处理与应用

    千次阅读 2013-03-31 16:47:58
    Data Matrix二维码图像处理与应用 摘要:以Meteor II Standard图像采集卡为基础,以识别金属零件上的Data Matrix二维码为目的, 对摄像头采集的图像进行处理。实现了该方法在工业流水线睥实时识别应用。 ...
  • 这个工具可以生成Data Matrix\ QR Code两种码制
  • Datamatrix原名Datacode,用于
  • 该文主要是利用OnBarcode.dll 生成DataMatrix 格式的二维码的一些简单方法和操作技巧。关于QrBarcode的二维码比较常见和简单,网上有很多资源。 1、附件为dll 2、利用上述控件生成二维码的核心代码: (a)C#代码:...
  • 点阵的datamatrix二维码,扫不出来,是什么原因啊? 如果是矩阵的就能很好的扫出来。是不是哪里需要设置呢?跪求大哥们的帮助。。。。!!! private void decode(byte[] data, int width, int height) { ...
  • 二维码Data Matrix的解码实现(zxing-cpp)

    千次阅读 热门讨论 2017-01-14 22:38:37
    二维码Data Matrix的解码实现(zxing-cpp)
  • 2D Data Matrix Barcode Formats IDAutomation 2D Data Matrix ECC 200 barcode products support all formats. The following table contains the size, capacity and error correction features of each format.
  • 随着二维码应用的普及,二维码类型也随着时代的发展越来越多了起来,其中DataMatrix码也逐渐被大家接收并投入使用,下面我们来详细了解一下其码制类型及制作方法: Data Matrix码是一种由 ID Matrix 于 1987 年开发...
  • 免费在线二维DataMatrix码生成器

    万次阅读 2016-08-17 09:41:50
    一款免费的在线二维码datamatrix生成器
  • Halcon 识别DataMatrix二维码

    千次阅读 2017-04-20 11:35:58
    create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'enhanced_recognition', DataCodeHandleLow) ***对比容差 set_data_code_2d_param (DataCodeHandleLow, 'contrast_t
  • Datamatrix原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明。 Datamatrix是一种矩阵式二维条码,其发展的构想是希望在较小的条码标签上存入更多的资料量。Datamatrix的...
  • 二维码Data Matrix编码、解码使用举例

    万次阅读 2016-12-26 21:27:32
    二维码Data Matrix编码、解码使用举例
  • 基于qt和libdmtx库生成DataMatrix的工程, DataMatrix开源的编码及识别库libdmtx的github:https://github.com/dmtx/libdmtx; 我用qt写的完整工程在:https://github.com/abcvincent/dmtxMaker; github->doc中....
  • 基于机器视觉的Data Matrix二维码识别

    千次阅读 2018-11-29 10:40:24
    基于机器视觉的Data Matrix二维码识别 二维码识别,这个在视觉应用中占有很重要的比例,各种各样的二维码都有可能需要识别。常见的QR码、Data Matrix码。本方案是识别Data Matrix码。 工业光源 对于这种产品...

空空如也

1 2 3 4 5 ... 20
收藏数 108,859
精华内容 43,543
关键字:

datamatrix