基于图象的条形码识别的算法研究及设计
扫描二维码
随时随地手机看文章
摘要:文章以条码技术、图象处理技术以及计算机软件技术为基础,设计出比较完善可靠的条形码识别算法。文中着重介绍了条形码识别的算法,并且对三种情况下即:理想的、小于五度倾斜的、稍微模糊的条形码进行了识别测试并给出改进思路。
关键词:图像;条形码;算法
0 引言
本设计的目的是在AOI(Automatic Optical Inspection,自动光学检测)设备提供的PCB板图片中对PCB板的条形码信息进行识别,应用于电子通讯产品的生产线上,进行PCB板的错误检测。AOI通过摄像头自动扫描PCB、采集图像、测试的焊点与数据库中的合格参数进行比较,经过图像处理,检查出PCB上的缺陷,并通过显示器把缺陷显示、标识出来,供维修人员修正。PCB上所贴的条形码记录了该PCB的身份信息,通过识别该条形码字符来认证PCB板。
本文主要解决的问题是条形码的编码规则如何转换为实际获得的像素点的参照标准,如何分割条形码以及如何以后台数据库为基准识别条形码。
1 条形码识别的算法研究及其实现
1.1 条码识别算法步骤
条形码识别算法的过程主要分为以下这三个步骤:
(1) 对于一个条形码图像,要识别的是从静区开始的有效区域,算法中考虑了判别是否到达静区,以此作为条码识别工作的开始标志;
(2) 算法中总体上采用把整个条形码按照39码型的编码规则进行分割,再依次找寻每个条形码字符的逻辑值在数据库中的匹配字符来输出。
1.2 算法分析
在条形码识别的算法分析过程中必须要解决三个比较关键的问题:1)条码的长宽在图像文件中用什么来衡量;2)条码的码字是不是要在识别之前分割出来,如果要分割出来,那么如何分割;3)分割后要怎么把对应的码字进行处理。
在设计之前理解了这三个问题,整个设计就会获得良好的解决。首先明确,所要处理的码型是39码。39码的一个重要的特点就是,具有不可伸缩性,也就是说,一个条码字符就是由占一定长度的,9个元素组成的,其中3个宽元素6个窄元素。39码符号均以*号开始和结尾,即木号是39码的起始,终止字符,并且39码是离散码,符号中两个相邻字符之间用一个位空分开。假设把条形码抽取9个元素,然后跳过1个往下抽取9个,依次类推,把抽取获得的每9个元素组成条形码的每个字符,只要检测到前9条元素(由条和空组成,为了更好说明,文中把条说成黑条,而把空说成白条)是*就开始进行条码字符的识别,如果不是则放弃。
对于扫描得到的条码BMP文件其白条和黑条的宽度及几何长度已经失去意义,必须用另一种方法来表示。此时可以给出问题1)的答案:长宽用像素的个数来表示。对一个BMP文件,其像素的数据包含对应的RGB值,用以表征它的颜色。因此可以通过该像素的RGB值来辨认出是白色还是黑色。在理想的状况下,白颜色的RGB值为(255,255,255)而黑颜色的RGB值为(0,0,0),但是实际条件下,一个条码图像不会达到那样标准的RGB值,也就是有模糊的状况,规定这样一个判决准则:把RGB值大于(125,125,125)的像素认为是白色像素,而把RGB值小于(12 5,125,125)的像素认为是黑色的像素。在程序中采用列表PixelList=[]来存储这些像素。然后基于以上的判决原则,程序实现“扫描”X轴,获得每个像素,如果该当前的像素值符合是黑色的条件,就记录到BlackCount,这时如果下一个的像素值还是黑色的就累加,如果下一个像素值符合是白色的条件,则把存储黑色像素个数的变量BlackCount清空,以方便来记录下一个黑条的像素个数。同样地,对于白色像素也有类似的操作。至此得到了一个列表GeneralList=[],里面存放着扫描X轴每个被认为是黑条或是白条其对应的像素个数。
通过上面一步,把实际的条形码转换为用计算机所能运算和操作的方式,这里必须解决第(2)个问题,即在开始条码识别的时候,要不要进行码字分割。显然,这一点对简化整个识别工作是个很大的帮助,如果能够正确地把条码的各个码字分离出来,那么剩下的工作就仅仅是把独立的码字的逻辑值和数据库相匹配,找寻到数据库中匹配的字符,再把它输出来,实现这一点是容易的。因此,条码分割是整个识别工作的难点和核心,整个算法重心也在此。
首先定义一个大列表CharList=[],由于列表中的元素可以为小列表,所以创建这个列表来放码字,每个码字为每个小列表,小列表里的元素是对应的黑条和白条的像素个数。如何实现码字分割,首先考虑到39码的特点:一个码字为9个元素,每个码字中间用一个白条隔开。所以只要在GeneralList=[]进行操作,把需要的那个元素抽取存放到新的列表中即可。
其次是判断是宽条还是窄条。先计算出黑条的平均像素个数,之所以考虑采用计算平均像素个数的方法,是为了解决条形码出现小角度倾斜依然能够成功识别这样的况。宽条或窄条的判断原则是:对黑条而言,如果其像素个数大于这个平均值就是宽条,如果小于这个平均值就是窄条。如果是宽条就赋逻辑值1,如果是窄条就赋逻辑值0。把这些逻辑值都放到列表中,这个时候的列表,也是列表的列表,大列表的元素是单个条码字符的黑条的逻辑值列表,小列表里的元素是01010这样的逻辑值,用来表示宽窄。同样地,对于白条而言,也有类似操作。至此,获得了两个大列表。一个是放黑条逻辑值的列表:BLogicList;一个是放白条逻辑值的列表WLogicList。大列表中的元素是每个码字的逻辑值列表,这样实现了码字的分割工作。
对于第3)个问题:分割之后要对码字如何处理。首先,可以建立一个数据库,将条码规则的信息放入数据库中。然后,只要在条形码识别软件中把数据库和相应的程序相连接,查找匹配值即可。在Access 2000数据库中,黑条逻辑值和白条逻辑值都是以文本的数据类型来存放,但是在列表中各个0101都是整型。因此把列表里面元素进行数据类型转换,列表里的数字转换为字符,成为一个字符串作为列表的元素存储。
1.3 软件调试及其分析
根据算法的实现功能,选择理想的和非理想的(小角度倾斜和轻微模糊的情况)三张条形码进行识别测试。
采用这三张条形码进行测试,步骤如下:
(1) 启动调试软件,出现一个用户界面菜单,供用户载入条码图片。
(2)选择一个条码的BMP文件后将其载入,可以获得:
(3) 开始条码的识别程序,此时可以获得条码识别成功的信息框,理想的条码图片的识别结果为:
倾斜角度小于5°情况下的条形码图片和表面轻微模糊的条形码图片的识别结果如图8所示:
从以上三种情况的条码图片测试可以看出所设计的条形码识别算法达到了预期的功能,实现了设计的目标。
2 结论
本文主要解决的问题是条形码的编码规则如何转换为实际获得的像素点的参照标准,如何分割条形码以及如何以后台数据库为基准识别条形码,这些都已经获得了良好的解决。
条形码的字符分割部分是本设计的难点所在。根据39码的编码规则进行算法设计,突破了该难点。设计对于一定程度的不理想条形码也做了处理。