新闻中心

EEPW首页 > 模拟技术 > 设计应用 > 基于图象的条形码识别的算法研究及设计

基于图象的条形码识别的算法研究及设计

作者:时间:2011-06-14来源:网络收藏

对于扫描得到的条码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 软件调试及其分析
根据算法的实现功能,选择理想的和非理想的(小角度倾斜和轻微模糊的情况)三张条形码进行识别测试。

本文引用地址:http://www.eepw.com.cn/article/187477.htm

b.JPG



评论


相关推荐

技术专区

关闭