条形码识别(2)——获取条形码条空(bar&space)宽度

来源:互联网 发布:阿里域名购买 编辑:程序博客网 时间:2024/05/07 07:20

条形码识别(2)——获取条形码条空(bar&space)宽度

标签: 机器视觉 条形码识别 Python

请先阅读条形码识别(1)——基础知识


1.目标

  • 条形码与其表示的数字字符按照下表对应,其中1表示一个单位黑条,0表示一个单位白空

  • 比如下图就表示左侧字符1的奇数编码(A子集)

  • 条形码从起始符到终止符一共有59个bar和space,95个单位长度

  • 获得从起始符到终止符的像素宽度,然后除以95,就可以得到单位长度的像素数
  • 将每个bar和space的像素宽度除以单位长度的像素数,就可以得到每个bar和space在表中的宽度

举个例子,从起始符到终止符一共有190个像素,那么单位长度的像素数就是(190/95=2),某个字符的bar和space宽度是[4, 4, 4, 2],将其转化为表中的宽度[2, 2, 2, 1],查表可得该字符为1

2.算法

  • 获取条形码bar和space宽度最简单的方法就是沿着某一行从头至尾扫描,简便起见,先只扫描一行,且该行为条形码中间行
  • 对图像应当进行简单的预处理,灰度化(多通道图转为单通道图)->二值化->中值滤波
  • 设置3个变量,currentPix表示当前像素值,pos 表示上次像素值变化的位置,lastPix表示上次像素值变化的位置的像素,当currentPix != lastPix时,记录下当前位置与pos的差,即当前bar或者space的宽度,然后更新poslastPix,继续遍历直到该行结束
  • 条形码从起始符到终止符一共有59个bar或者space,因为是从行的起始位置开始扫描,所以左侧空白区也被扫描进去了,因此最终bar和space的数量为(60=59+1)

3.实现

#创建:2016/01/26#文件:BarCodeIdentification.py#作者:moverzp#功能:识别条形码import sysimport cv2def get_bar_space_width(img):    row = img.shape[0] *1/2#img.shape[0]表示图像的总行数    currentPix = -1#初始化    lastPix = -1    pos = 0    width = []    for i in range(img.shape[1]):#遍历一整行        currentPix = img[row][i]        if currentPix != lastPix:            if lastPix == -1:                lastPix = currentPix                pos = i            else:                width.append( i - pos )                pos = i                lastPix = currentPix    return width#载入图像img = cv2.imread('res\google6.jpg')grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转换成单通道图像ret, grayImg = cv2.threshold(grayImg, 200, 255, cv2.THRESH_BINARY)#二值化grayImg = cv2.medianBlur(grayImg, 3)#中值滤波#提取条空宽度barSpaceWidth = get_bar_space_width(grayImg)print 'bar & space\'s numbers:', len(barSpaceWidth)#只有60是正确的print barSpaceWidth

检测的图片:

检测结果:

  • 第一个数值77表示左侧空白区
  • 起始符和终止符分别是[4,5,4], [4,4,4],宽度比是1:1:1,说明检测正确

4.总结

  • 检测bar和space宽度是关键的一步,最简单的方法是沿着某一行从头至尾扫描,记录下像素值变化的下标差,即为当前bar或者space宽度
  • 实际情况中会扫描多行,以减小误差,提高精度
  • 如果某行扫描的bar和space数量不是60,应当舍弃改行数据
0 0
原创粉丝点击