断针条码视频号
断针条码B站
Label打印比较常见的一种打印机是针式打印机,这些标签通常用在产品的货物信息、物流信息等标识上。这些标签通常会包含文字和条码信息。而对于针式打印机打印的条码,最可怕的问题就是打印机的针断了。断针后条码则会断开。而且这种断开方式,不是和条码的条垂直的,而是和条码的条平行的。这样就会造成本来是一个宽的条,被分割成了两个或多个窄的条,又或者是窄的条的数据就没有了。这样打印出来的条码信息就会出错了。断针对于文字、图案等信息的相对影响要小一些,因为对于文字、图像来说,少一些信息,整体上还是可以识别读取的,至少对于人眼来说并不会有太多影响。但是条码不一样,条码本身人眼不具备直接读取的能力,是需要机器视觉或扫码枪来识别的。但是如果因为断针,条码数据本身就不对了,那就会造成无法读取或读取错误的情况。条码遇到这种问题通常比较难解决,因为条码并不具有校正功能,不像二维码还有校正功能,即使少了部分信息也仍然可以读取。
断针的物流标签上的条码
上图就是断针的物流标签,可以看到其中有多处断针的情况:
断针位置
其中最左边“塘”字处是断两根针,所以断开的间距更大一些。其他位置都是断一根针的,断开的间距要小一些。从断开的位置来看,上面的最大的条码中,很多个粗的条被分割成了多个细的条,而中间位置的细条则因为断针变得更细更淡,都快要看不到了。
被断针分割的条码
这种断针条码实际上是比较难识别的。如果算法上没有什么过人之处,就很难读取到了。当然,如果算法上进行一些优化或针对具体的条码类型进行适配(如code128的条码是3条+3空格式编码的,共128个ASCII字符),那么也是可以读取的,但是稳定性可能不太理想。对于当前的图像可能能读到,但是如果另外再有一个断针的,如上面图像上,连续断三针、四针的,那么可能一个条直接就没有,这时也再优化可能也不会有结果了。
NI视觉助手中识别断针的条码
上面的图像中共有2个条码,编码类型都是Code128类型的。下面一个比较小的条码没有受到断针的影响,断针刚好都在空处,条码能准确识别。而上面的一个比较大的条码则没有这么好运了,多处的条被断针分割开了,这里虽然也识别到了,但是条码类型是错误的,被认为是Codabar条码,读取的结果则是错误的,分数仅有815分。
对于上面的这种断一根针或两根针的条码,可以考虑使用形态学来处理一下,将条膨胀变大以填充断针的影响,如使用膨胀、或开、适当开等方法来处理。但是这里的膨胀,也只能膨胀刚好能填充断针,而不填充正常的空,如果将正常的空也膨胀填充了,那也是无法读取的。
提取颜色平面-将彩色图像转为灰度图像
条码识别函数本身是可以读取彩色图像的,但是形态学函数只有灰度图像和二值图像的,所以这里先将彩色图像转换为灰度图像。
灰度形态学-开
对灰度图像做形态学开运算,大小是5,结构元素则是六边形。
读取断针的Code128条码
形态学后,断针的影响比较小了,再使用条码读取函数来识别条码,这时这个条码就可以读取了。从上面的图像看到,条码类型是Code128,数据也是正常的,分数是1000满分。
上面的这种效果,也只能是对当前的这个图像勉强可以识别,并不具有普遍适用性,例如将开操作的大小设置为7以上时,则无法正常读取:
形态学开操作大小7
形态学大小7时,空被条完全占据,多个条已经连成一个区域,这时是无法读取的:
形态学开操作大小7时无法读取条码
对于形态学填充断针的位置,也可以考虑使用滤波器来处理,例如中值滤波器:
中值滤波器-滤波器大小是7*3
滤波器方法的条码读取
因为使用滤波器后,中间的细条已经比较淡了,所以在条码读取时,定位条码功能中的最小边缘强度将默认值的75改为30,这样才能读取到条码,不然无法读取。
上面的这些方法,仅对当前的图像有作用,如果换一幅图像可能就无法读取了。例如直接改一下图像分辨率,就可能无法读取了。所以不具有通用性,就算当前的图像能读取,其他的图像也不一定能读取,稳定性肯定是不太理想的。所以,对于这种断针的打印机,那还是换个打印头比较理想,不过好像那种好的条码打印机的打印头还不便宜,斑马的打印头要好几千一个。
断针条码图像和视觉助手脚本(2020版)
[attach]19830[/attach]