一维条形码识别的整个过程原理通俗易懂讲解

这里我随便在我的编译原理这本书后面拍的一个条形码来进行说明

以下为一个示意图,一维条形码一共有如下几个区域组成(其实一个条形码下面已经给出了代表哪些数字了,我写的这篇文章讲述其原理,教机器如何读取)

 

 

首先明白如下几点:

一、条码的黑色条表示二进制的1,白色代表0,而且0.33mm宽度的黑色或者白色条为一个基本的二进制位,下面可以看出有的黑色条很宽,说明连着好几个二进制1,下面这个图是上面那个图的放大。

二、一维条形码只能表示数字,不能表示字母符号和汉字,每个数字由7个二进制位组成,而且这些二进制组成的规则不是ASCII码,而是自己的一套编码规则,比如 0000 101,这个表示的不是数字5(ASCII码表示的就是5),应该按照官方给的如下编码表进行解码,查找下面的表发现是左侧数据符的偶性字符(B组)中的6。起始符,终止符编码为101,分隔符编码为01010(没有为什么,官方规定的,如果哪天你发明了啥,你就是官方,你想咋规定就咋规定)

 

三、可以数一下上面的两个条形码,一维条形码都是由13个数字(是1 2 3。。。这样的数字,不是二进制0 1 0 10这样的数)组成,分别代表如下的意思,:前三个数:制造码,接着四个数:制造商代码,接着五个数:商品标识代码,最后一个数:校验码

比如第二张图片条形码是692 0152 46102 0,

692(制造码),0152(制造商代码),46102商品标识代码,0(校验码)可以用来防伪以及识别校验

而第一个数字(被称为前置码)是隐藏的,不占用黑条白条来表示(由后面数字的奇偶性来推断出,这个是官方规定的规则,后面我会进一步解释其原因),所以扣掉一个数字,总的只有12个数字(左侧数据符6个+右侧数据符6个),刚刚我说了一个数字由7个二进制位组成,每一个二进制位由一个黑条或者白条来表示,而每一个条的宽度为0.33mm,所以这里可以计算一下:

(13-1)*7+11 = 95个黑色或者白色的单位宽度0.33mm的条,其中的11个二进制位是起始符,终止符编码为101,分隔符编码为01010,总共占掉11个黑色或者白色的条

95*0.33 = 31.35mm = 3.135cm,你可以用尺子量一下你所看到的一维码,总的宽度是不是这么宽

四、上面这个官方EAN-13编码表是最常用的一维码编码方式,我们认真观察一下会发现,同一个数字竟然有三种编码方式,而且每一个编码结果都对应唯一的一个数字(你在上面找不出重复的两个二进制串对应同一个数字),也就是编码是唯一的,只要随便给我一个二进制串0001011,对比上面的表就可以唯一确定对应的是左侧奇性字符A组的9,这个数字。但是你给我一个数字9,我却不能唯一确定他对应的是哪个二进制串,因为有三种编码方式,上表可以找出0001011,0010111,1110100三个二进制串与之对应。这个意思就是解码出数字是唯一的,但是逆回去却不是唯一的,不过没关系,我们条形码代表的就是一个二进制串,需要的仅仅是解码就行了,所以解码出来的每个数字一定是唯一的。

五、刚刚说的第一个数字为啥是隐藏的,可以直接由后面数字的奇偶性推断出来,以及与刚刚那个解码表的三种编码方式有什么联系,为什么每个数字要规定三种二进制串的编码方式从而搞得这么麻烦,接下来揭开它的神秘面纱:

再来看看这张图,图中用黑或者白条能表示的数字,真正的其实只有12个数字(左侧数据符6个,右侧数据符6个),第一个前置码6这个数字实际上是由 左侧数据符6个数的奇偶性推测出来的,这个具体什么意思呢

比如刚刚上面图片条形码是692 0152 46102 0,

692(制造码),0152(制造商代码),46102商品标识代码,0(校验码)可以用来防伪以及识别校验

这里第一个6就是前置码,920152称为左侧数据符,461020称为右侧数据符。而你如果用扫描枪扫描这个条形码,实际上获得的只是92 0152 46102 0这12个数,那为啥就能得到前置码6,最后得到最终的一维码为692 0152 46102 0的呢,实际上这里的前置码6就是由左侧数据符920152的奇偶性推断出来的,首先指明一个误区,不是指9奇数,2偶数,0偶数...这样的奇偶性,而是指下面这个表1 EAN-13编码强制规定的奇偶性(其实不是啥奇偶性,就是官方搞了这么一个名字,我觉得有点误导人),来看看这个表,我们可以得出,左侧数据符分为奇性字符,偶性字符两种,而右侧数据符都被规定为偶性字符了。我们来看看扫码枪的执行过程吧:扫码枪一次性“滴”扫完了整个条形码,实际上是串行的,慢动作来看就是,从这边第一个黑条一个一个往右边扫描,直到扫完这95个条(指的是单位宽度0.33mm的条,很宽的黑色条是包含了好几个黑条)。那么扫到的这些条,按照组成规则,会自动去掉起始符,中间分隔符,终止符,剩下了真正有用的条。现在前7个条(黑条代表二进制1,白条代表0)就会根据下面这个表EAN-13查找出对应的字符,并记录其左右性和奇偶性,

除开前置码,现在前7个条是 白,白,白,黑,白,黑,黑(注:这里所说的白,黑条指的是单位宽度0.33mm的条,你看到的很宽的黑条实际上是由好几个单位宽度的黑条组成的,也就是会解析出来好几个连着的二进制1)。

也就是0001011,从上图中也能清清楚楚看出就是0001011,查下面的表发现对应数字9(当然条形码下面也直接标出了9,但是扫码枪不知道,他只能识别黑条,白条),那么再看他属于的类,发现它属于左侧数据符,而且是奇性字符(注:和9是奇数没有任何关系),我们再看看,因为我们的扫码枪是顺序扫描(从左往右扫描),那前六个扫到的当然就属于左侧字符啦,这里我们跟我们查表出来是左侧数据符相吻合了,就说明完全正确了,我们的扫码枪或者一维码没有拿反(其实官方这个表之所以这样规定,就是可以判断扫描正反,防止扫描错误)。同时从这个表我们记录下这个字符9属于奇性字符。接下来我们继续往右扫描,得到0011011,查表发现是左侧偶性字符2,仍然是左侧字符,吻合,而且记录下他的奇偶性为偶性,再继续向右扫描得到。。。。。。

 

扫描完左侧字符的42个条码后(每个字符由7个条码组成,左侧字符总共有6个,总的就是42个条码),得到了六个字符920152后,同时得到了这六个字符的奇偶性(注:这里说的奇偶性不是指数字本身的奇偶性,而是上面官方表中强行规定的奇偶性),比如是,奇,偶,偶,偶,奇,奇,然后再查下面的表2,发现对应的前置码为6(o代表奇性,E代表偶性)。所以我们的扫码枪扫描得到6个数,然后又推导出了第一个前置码,所以就得到了7个数6920152,然后同理再扫描右侧数据符6个数就行了,只是不需要记录奇偶性了,因为我们已经不再需要推导啥数字了(而且从上面的表可以看出,右侧数据符都被强行规定为偶性字符了),扫描右侧字符得到461020,所以现在总的一维码就是6 920152 461020,ok总的一维码识别以及结束了,剩下了就是查数据库692(制造码,),0152(制造商代码),46102商品标识代码,0(校验码)可以用来防伪以及识别校验,跟数据库进行对比,得到到底属于哪的制造码,哪家制造商,属于哪个商品了呀。对了这里校验码的作用讲一下,是最后一个数,用于判断读取是不是正确的,就是判断这个一维码是否被人恶性破坏了,或者扫码枪自己坏了等等情况。

注:从上面这个编码表可以看出,每个数字都是由0..1..0....1或者1..0..1.0这样子组成的(黑条代表1,白条代表0),

也就是说明每个数字一定有两个交错黑条和两个交错排列的白条组成,这是官方规定的,没有为什么,可以仔细观察你所看到的一维码,一定是这样的规则

总结:一维码读取过程如下

1、扫码枪利用一维码上面白和黑条的不同反光率,射出的红色光线得到不同的反射强度,然后利用光电传感器转为电信号,滤波放大后转为数字信号0,1。每个数字由7个黑色或者白色单位宽度的条组成。当然你可以用摄像头拍摄然后图像处理方式进行一维码中0,1的提取也是可以的

2、从左往右扫描得到左侧6个数字,同时根据编码表给出的奇偶性推导出第一个前置码为多少,再扫描右侧数据符6个,得到了总的13个数据符

2、这13个数字里面包含了产品的重要信息,跟数据库进行对比得到产品的生产商,产品名称等信息

我在写这篇文章之前也是参考了很多的文章,其实我觉得讲得都不直观,很多重要点都没能通俗表述出来,我也是参考那么多文章加上自己的理解,写出的这篇目前为止最为通俗易懂的文章了

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页