条码检测与识别是一种常见、实用并且相对简单的一类技术。超市上使用的条码识别机一般都是红光照射拍摄取图,这样在检测条码的时候把检测区域限制得非常小,检测变得很简单且可靠。这里介绍的检测可能比超市中使用的条码检测技术要稍微复杂一点,因为这里检测的条码目标不是一个,而是将图像中可能出现的所有条码检测出来。
一、检测:下面是待检测的条码图:
    可以看到,图中有14个条码。检测的关键在于描述,即如何用计算机懂得的语言来描述目标,描述清楚了检测也就基本解决了。条码是一类由密集的平行线段组成的,这其中包含几个含义:1、线段,2、密集,3、平行,4、条码组成的区域有足够大的面积。检测平行的线段可以通过检测一个方向上的直线实现,检测是否密集可以通过在检测到的线段附近搜索线段,然后统计密度实现,检测这些线段构成的区域面积是否足够大可以通过膨胀->腐蚀->膨胀实现,即如果线段所在的区域占有的面积不够大,通过形态学操作可以去除。这些都是比较简单的操作,具体不详述了,检测结果如下:
    当然,如果条码的背景简单,那检测的方法也是可以简化的,或者用其它方法替换,总之根据具体应用来设计检测算法就是了,很难有一种稳定可靠又高效普适的检测方法。
二、识别
    检测到条码以后再识别就不麻烦了,关键是条码图像不要太差,两条条码黏在一起是肯定没法识别的。精力有限,没有做所有类型的条码识别,只是针对code39码做了识别。
    下面的是code39码图像:电脑
这种图像还是比较清晰的,但是可以看到,就算是二值化,检测也会受下面的数字干扰,因此首先得采用前面提到的检测方法把条码检测出来,检测出来再二值化。二值化的方法也是多种多样的,像这种图像,采用大津阈值就能很好的二值化了,或者采用局部阈值,二值化的效果会更好一些,因为大津阈值毕竟是全局阈值。检测并二值化的效果如下图所示。
    这种二值图就不受下面那些数字的干扰了。其实到这来识别算是完成了,为什么这么说呢?因为已经二值化好了,接下来只需要投影到一维,再分割成一维的二值信号,即可根据code39码的编码标准解出来了。code39码的编码标准网上很多,这里就不复述了。值得一提的是,投影到一维信号在二值化的过程中,可以采用多阈值的方法分别识别条码,因为单个阈值可能分割得不是很好,多阈值当中,只要有一个阈值分割的结果能够识别出来就可以,因为条码编码是有规则并且有校验码的,识别结果是否正确可以通过校验码来校验。下面是针对这个条码的识别结果:
 
     可以 看到,识别的结果跟条码下面的数字还是一致的。对数百张code39码做了实验,这种检测与识别算法还是挺可靠的,以前统计了一下,识别率超过90%了,个人还是挺满意的。如果是自己拿手机照的code39码,图像质量会比这个更好,可以看出这个条码其实是被压缩过的,并且背景都是灰蒙蒙的,如果放大还可以发现噪点也是挺多的,有点影响分割,自己照的条码图像质量比这个要好些,识别更可靠了。
    以上非常简单地谈了一下个人的检测与识别条码的方法,仅以code39码为例,其它类型的条码也是大同小异,无非是编码规则不一样罢了。当然条码检测与识别的方法可能非常多,也希望同行能把你们自己的经验分享一下啦!大家互相学习互相进步嘛!