条形码识别(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的宽度,然后更新pos
和