4 E9 O2或O8 E1或E7 O5 5 O6 E0 O4 E3 表7和表8分别为正向译码和反向译码时EAN-13条码编码与归一化值的对应关系。 表7 EAN-13条码编码与归一化值的对应关系(正向译码) 字符 值
左奇字符
编码 0001101 0011001
0
(5,3)
左偶字符
编码 0100111 0110011
(2,3)
右偶字符
编码 1110010 1100110
(5,3)
1 0010011 (4,4) 2 3
0111101
(5,5) (3,3)
0011011 (3,4) 0100001
(2,5) (4,3)
1101100 (4,4) 1000010
(5,5) (3,3)
4 0100011 (2,4) 5 6
0110001
(2,2) (3,5)
0011101 (5,4) 0111001
(5,2) (4,5)
1011100 (2,4) 1001110
(2,2) (3,5)
7 0101111 (4,4) 8 9
0111011 0110111 0001011
(4,2) (3,3)
0000101 (3,4) 0010001 0001001 0010111
(3,2) (4,3)
1010000 (4,4) 1000100 1001000 1110100
(4,2) (3,3)
表8 EAN-13条码字符值与归一化值的对应关系(反向译码) 字符 值
左奇字符 编码 1011000 1001100
0
(2,3)
左偶字符 编码 1110010 1100110
(5,3)
右偶字符 编码 0100111 0110011
(2,3)
1 1100100 (3,4) 2 3
1011110
(2,5) (4,3)
1101100 (4,4) 1000010
(5,5) (3,3)
0011011 (3,4) 0100001
(2,5) (4,3)
4 1100010 (5,4) 5 6
1000110
(2,2) (4,5)
1001110 (2,4) 1001110
(2,2) (3,5)
0011101 (5,4) 0111001
(5,2) (4,5)
7 1111010 (3,4) 8 9
1101110 1110110 1101000
(3,2) (4,3)
1010000 (4,4) 1000100 1001000 1110100
(4,2) (3,3)
0000101 (3,4) 0010001 0001001 0010111
(3,2) (4,3)
由表5~8可以看出,条形码编码和归一化值在多数情况下呈现一一对应的关系,只要确定了归一化值就能确定字符值,但是有四种情况例外。以正向译码为例,在表6中,左侧奇字符和右侧偶字符1, 7归一化值均为44,左侧奇字符和右侧偶字符2, 8归一化值均为
33,左侧偶字符1, 7归一化值均为34,左侧偶字符2, 8归一化值均为43,这几种情况可以根据字符的条空宽度 进一步判别。表9为1728字符标准条空宽度值,其中字符上有“-”的对应条,否则对应空。
表9 1728字符标准条空宽度值 字符值
左奇 条空宽 左偶字 条空宽 右偶字 条空宽
字符编码 度值 符编码 度值 符编码 度值
1
0011001
2
0110011 1101100 1000100 1001000
1100110
0010011 0011011
7
0111011 0010001
8
0110111 0001001
根据表9中各字符条空宽度的特点可知:①对于左侧奇字符、右侧偶字符1和7,可通过比较
与
来判别,若
> 与
,则为字符1,反之为7;②对于左侧奇字符、右来判别,若 与
>
,则为字符8,反之为2;③ >
,则为字符7,反之为>
,则为字符2,
侧偶字符2和8,可通过比较
对于左侧偶字符1和7,可通过比较来判别,若与
1;④对于左侧偶字符2和8,可通过比较 反之为8。
来判别,若
采用相似边距离归一化的条码识别方法,当条码质量存在缺陷使得实际测量值和条码应该具有的理论值有较大偏差时,仍能正确解译。例如对于左侧奇字符“0”进行译码,该字符的四个元素宽度的理论值应该是
,但是由于印刷等原因
的影响,实际上测量值是 。如果只根据元素宽度的
测量值进行译码,那么这四个元素的宽度测量值四舍五入取整后分别为3、3、1、1,从而造成译码错误。若采取相似边距离归一化的条码识别方法进行译码,此时
,由表7知字符编码为左侧
奇字符“0”。可见利用相似边距离归一化的条码识别方法判别字符值,可以得到比较满意的效果。 4.4纠错处理
采用相似边距离归一化的译码方法能够在一定程度上消除条、空误差对译码识别的影响。当系统误差特别是条码印刷误差较大导致
、
改变时,译码将出错。因此译码软件
应具有一定的纠错能力,以减少条空宽度值不精确的影响,提高条码识别率[1]。纠错主要从以下两方面进行:
(1)如果条码字符的
或
或
在临界位置,当条或空的宽度有误差时,就会导致
和
中只有一个发生错误,则引起该字符
的整数值增1或减1。如果
和
的奇偶性、字符值的改变,如果都出错,则引起该字符值的改变,但奇偶性未
变。实际情况中第一种现象出现的概率比第二种情况大得多,因此本文主要对第一种情况进行纠错。由表1和表2可知,右侧字符为全偶字符排列,左侧字符有10种奇偶排列,这11种排列构成有效的排列集合,把所译的字符串奇偶排列与有效的奇偶排列对比,判断是否为排列集合成员。若是,所译的字符串不作任何处理;若不是,所译码出错,并找出 或
哪个处在临界值,修改它的归一化整数值,这样可实现纠错。
(2)当字符数据为2、8、1、7时,由于条码宽度不精确导致误码,即2判成8、1判成7,或反之。分析这种误码相对于校验位的差值有一定规律,因此可利用此规律进行纠错。由EAN-13校验方法知:当偶数位上有2错译成8或1错译成7时,计算得到的实译值与校验值差-8或2,反之8错译成2或7错译成1时,计算得到的实译值与校验值差8或-2;当奇数位上有2错译成8或1错译成7时,计算得到的实译值与校验值差-6或4,反之,8错译成2或7错译成1时,计算得到的实译值与校验值差6或-4;当然别的字符
译错也可能出现这些差值,但几率很小,可以不予考虑。这样若程序校验没通过,可加一个判断,根据差值判断其属于上述哪种情况,找出出错的字符并纠正。 5 程序实现
5.1 应用Visual C++生成条形码图像 5.1 1 创建工程文件
(1)打开VC++ 6.0,点击“File”菜单的“New”菜单项,在出现的界面中选定“Projects”栏,点击“MFC APPWizard(exe)”,工程文件名为Generator。按“确定”按纽,进入MFC APPWizard。
(2)在MFC APPWizard第一步选择Single document文档类型。第二步和第三步按默认方式。第四步中去掉“Docking toolbar”、“Initial status bar”、“Printing and print preview”前面的“√”,即不选该三项。然后点击“Advanced…”,在出现的界面中填写“File extension”为“bmp”。第五步和第六步按默认方式。最终生成工程Generator。
(3)修改菜单。①增加“操作”菜单;②删除“编辑”菜单;③修改“帮助”菜单。参见工程文件。
(4)插入两个对话框(IDD_WELCOME、IDD_GIVECODE)并修改这两个对话框。参见工程文件。 5.1.2 类代码编制
(1)在Generator工程中增加新类CWelcomeDlg,类型为Generic Class。 (2)在Generator工程中增加新类CGiveCodeDlg,类型为Generic Class。 (3)点击“View”菜单的“ClassWizard”菜单项,在出现的界面中,选择Class Name为“, CGeneratorView”,增加成员函数,Object Ids、Messages、Member functions分别为:①ID_EDIT_GIVE、COMMAND、ON_ID_EDIT_GIVE:COMMAND;②ID_FILE_SAVE、COMMAND、ON_ID_FILE_SAVE。