点击上方“”,选择加"
重磅干货,第一时间送达
本方案将建立一个基于机器视觉的装配线检测手机条码平台,将产品放置在装配线上,高速工业相机逐一收集到计算机进行一系列处理,最终检测条码是否合格,分类不合格条码, 完成手机条码质量自动检测功能。
检测对象:手机产品条码(包括产品码) SN码、 IMEI 码)
适用范围:自动生产线
检测速度:1 件/两秒( 20 厘米 / 秒)
(手机产品条码)
(总体结构示意图)
它包括:装配线输送装置、照明装置、高速相机图像采集装置、计算机图像处理部分。
本方案中输送对象质量小,不需要过多考虑输送带的承载能力,也不涉及产品的装卸。因此,采用普通的带式输送带结构,以步进电机驱动输送带同步轮为滚筒, 并用一块单片机对步进电机进行简单的运动控制进而控制传输带传输开关和速度。同时,为了在图像采集过程中区分手机产品的条码和背景,传输带颜色为深黑色。
(带式传输带结构图)
该方案最重要的部分是成像系统。本方案中,检测对象为条形码,形状大,特征明显, 所以相机不需要很高的分辨率。 然而,该方案是一种实时处理设计,因此图像采集和处理的速度高于检测对象,即相机的最大帧率;成像对象移动, 为避免图像模糊等问题,采用全局电子快门相机; 此外,相机还需要支持外触发快门和与计算机快速数据传输的特性。综上所述,工业相机应具有以下特点:
(1)最大帧率高
(2)全局电子快门帧曝光
(3)支持外触发快门
(4)接口与计算机快速传输数据
综合考虑,选择本方案 德国Basler 公司制造的 acA800-200gc/gm 型号工业相机的参数如下:
(工业相机参数)
工业相机改造符合本方案的设计要求。
该方案采用传感器触发控制相机快门。传输带为黑色,条码背景为白色, 它们的反射能力差距很大, 因此,漫射式光电传感器可以很好地利用这一点来检测产品条码是否进入相机的拍摄范围。 将光电传感器垂直放置在传送带上方,靠近相机。当条形码到达传感器下方时,反射光发生变化,触发开关状态,间接控制相机快门,实现条形码图像自动采集的目的。
常用的机器视觉光源有 LED光源、卤素灯(光纤光源)、高频荧光灯。LED 光源最常用, 使用寿命长, 且由于 LED采用多个光源 LED排列而成, 可设计成复杂的结构, 实现不同的光源照射角度。由于条码在本方案中被检测到, 为光滑平面,采用漫反射环 LED光源照射, 能很好地区分产品条码和传输带的黑色背景。其中值得注意的是, 必须调整光源的高度和角度, 直到相机拍摄的图像能完美区分条形码和背景,而且没有反射。
(漫反射环形照射)
本方案的检测速度约为2秒1件,因此图像处理的计算机使用cpu主频较高( 3GH以上)一般办公计算机可满足要求。MATLAB作为图像处理的主要软件。
计算机从数据接口中获得的条形码图像是由高速相机直接拍摄而未经处理的图像。 CMOS噪音、倾斜等问题可能发生在特性和放置等因素上,而且图像是彩色图像, 因此,在检测条码之前,应预处理原始图像。预处理包括三个部分:滤波除噪、二值化处理和倾斜矫正。
本方案采用 CMOS集成度高的相机带来元件干扰噪声。因此,有必要消除随机噪声对这些图像的干扰。实验表明,本方案中的图像噪声多为胡椒盐噪声,即噪声点往往表现为图像上的孤立像素点,其像素灰度与相邻像素灰度明显不同,因此频谱较高。对噪声类型,采用中值滤波,对脉冲干扰和椒盐噪声有很好的抑制作用,并能更好地保持图像边缘。从条码图像的特征来看, 它的特点是由一定宽度的纵向黑白条空组成,我们通过建立不同大小的模板来过滤含噪音的图像, 比较其过滤噪声干扰的效果。在 MATLAB中可以使用 filter2 经验证, 3x3 方形滤波器效果最好,本方案采用3x3 中值滤波器。
(带椒盐噪声的图像)
(3x3 中值滤波后的图像)
为便于图像的后续处理,需要对图像进行二值化处理。在本方案中,产品条码为白色矩形贴纸,背景为黑色传输带, 直接从相机中获得的图像是彩色图像。获得的图像灰度化后,二值化处理后可以轻松分割产品条码的贴纸。可利用MATLAB的 rgb2gray()函数可以将彩色图像转换为灰度图像,然后使用 im2bw()函数可以很容易地二值化图像,阈值取 0.67 ,获得更好的二值化图像。可见二值化后纸面边缘更清晰。
(原图像) (二值化后图像)
由于物体在传送带上的位置不固定, 因此,相机采集的条码图像中的条码区域可能会倾斜, 必须将倾斜的条码图像转正,以便于后续的条码定位和分割提取。
二值化后观察条码图像, 可以发现,纸面区域与背景之间有明显的相似矩形框,倾斜条形码图像的显著特征是纸面区域在二值图像中以一定角度旋转,旋转角度不能太大。因此,要纠正倾斜条形码图像,首先要检测倾斜角度,
然后逆转其角度值,得到包含条码的矩形区域的水平条码图像。考虑到图像位置的随机性和计算的复杂性, 本方案决定采用 Hough实现倾斜条码图像倾斜角的检测。实现方法是先用MATLAB的 edge() 函数找出二值图像 的边 缘,再 用 其 Hough 变换相 关函数:hough() 、 houghpeaks() 、 houghlines() ,获得最长边的起点和终点,利用斜率公式找出条码图像的倾角,最后利用 imrotate() 旋转函数纠正图像的倾斜。经过测试,效果很好。
(原倾斜图像) (倾斜纠正后的图像)
由于同一款手机产品,其条码的贴纸上的条码字符等信息的位置都是固定的,因此把图像中纸面部分分割出来后, 按固定位置的物理分割能很容易把条码部分分割出来。
由二值化图像中可见贴纸与背景有明显的特征区分,我们经过b wareaopen()函数处理后可把面积小的点吞噬掉,从而获得边缘较为清晰的二值化图像。
(经bwareaopen 函数处理后的图像)
获得此图像后,对图像进行从左到右的逐行检测,得到其像素点第一次由黑到白变化点的坐标,即为该纸面边缘的第一个坐标,记为P1;再用相同的方法分别从右到左、上到下、下到上进行检测,分别把检测到的坐标记为P2、 P3、P4,则该四个坐标确定了纸面的位置。最后调用 imcrop()函数,按这四个坐标把摆正后的图像的纸面分割出来。
(分割的条码图像的纸面部分)
上文已说明, 同一款手机产品其条码的贴纸上的条码字符等信息的位置都是固定的,因此对应同一款手机计算好其条码在贴纸上的位置,再次调用 imcrop()函数,能把贴纸上任意部分分割出来。
(分割出来的条码)
条码图像经过处理后最终得到的是只有黑白条空组成的二值图像, 该点的颜色信息在阔值变换时已经定义 ,用 255 和 0 表示白色和黑色, 则接下來的任务就是对此图像所包含的数字或英文字母信息进行译码, 即条码识读。
条码识别的算法有很多,常用的有:
①宽度测量法:在图像方式的译码过程中, 宽度的测量不再采用传统的脉冲测量法 , 而是通过记录每个条或空的宽度中所含象素的个数来确定实际的条 / 空宽度 , 从而确定整个条码符号所代表的信息。
②平均值法:对条码符号图像中从起始符到终止符整个宽度进行测量 , 然后除以 95 标准宽度 , 求出单位模块所含的像素列宽, 再分别测量各个条空的实际宽度此宽度以单位宽度为单位计算
③相似边距离测量法:这种方法的设计思路是通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值, 而不是由各元素宽度的实际测量值来判别。
前两种方法对条码图像的要求非常高 , 因为它们都是测量各元素符号的实际宽度 , 然后根据查表法得到所代表的码值。如果实际测量值与标准值存在一点偏差, 就不能实现正确译码。而第三种方法正是有效的解决了这一问题 , 因此本方案采用相似边距离测量的方法来实现译码功能。理论上条形码字符的逻辑值应该由条形码的实际宽度来判断, 而相似边距离方法的设计思想通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值,而不是由元素宽度的实际值来判别。此种方法的优点是:即使条码质量存在缺欠,使得实际测量值和条码应该具有的理论值有较大的偏差, 仍然可以根据相似边的距离能够正确解释。
(条码字符宽度示意图)
图中 C1,C2,C3,C4表示每个字符中四个相邻条、空的宽度, T 表示一个字符的宽度, T1,T2 表示相似边之间的距离,把其归一化后按表查询即可获得其编码值。
(EAN-13 条码字符与归一化值)
由 MATLAB 实现该方法,关键是要检测出相似边之间的距离。可从左到右对条码进行水平灰度扫描, 以灰度值跳变的点作为条和空的标记坐标,从而计算出由各个条、空的宽度,并通过计算 n=T/7,T=1C+2C+3C+4C 得到单位模块的宽度。各个条空的宽度除以单位模块的宽度就是归一化的条空宽度。而为了方便译码,我们除去起始符 3 个条空,中间分隔符 5 个条空,终止符3 个条空,对剩下的 48 个条空每 4 个条空为一组进行译码。计算相似边之间的距离t1、 t2 从而得到归一化( T1,T2)。最后查表可得条码字符。再根据译出的左侧6位数据符的奇偶性算出前置符。以下是译码效果:
(条码识别结果)
其他码型( SN 码、IMEI 码)原理相似。
获得条码识别的数据后,需要与条码下方的字符对照,验证条码的准确性。字符识别的算法有很多, 由于该方案中只需要识别简单的数字和英文字母,因此通过简单的 OCR 算法对其条码下方的数字、英文字母字符进行字符检测,再与
识别的条码字符相比较, 一致则显示该产品条码检测通过,不一致则记录该商品编码。
首先建立一个字符模板数据库,用于字符匹配。该方案中需要识别的字符只有英文和字母,因此数据库不大。
(字符数据库)
然后使用物理定位分割,把条码下方字符分割出来。
(条码下方字符)
接着,对图片进行水平方向的投影,这样有字符的地方的投影值就高,没字的地方投影得到的值就低。
(水平投影值)
接下来,用一根扫描线从下向上扫描。这个扫描线会与图中曲线存在交点,
这些交点会将山头分割成一个又一个区域。该条码字符为 13 位,加上条码突出来的几点一共为 18 个区域,因此,当扫描线将山头分割成 18 个区域时停止。然后根据这 18 个区域向水平线的投影的坐标就可以将图片中的 13(18)个字符分割出来。
字符分割出来后,最后用 ORC神经网络匹配,把分割出来的字符与字符库里的字符图片进行匹配, 最终把字符识别出来。把识别出来的字符串与条码识别出来的字符串对比,即可检测出该条码是否准确。
本方案存在尚需改进的地方:
1)对光源的摆置要求较高,依赖光源获取对比鲜明的图像,否则将可能出现条码贴纸与背景分割失败的情况;
2)尽管概率很低,但依然存在某张条码检测失败的情况,此时本方案的做法是对该次检测抛弃;
3)本方案只对条码的编码质量进行了检测,即只对条码所包含的字符是否与该手机产品相关信息的编号字符相对应进行了检测,而没有对出错的进行纠正。
在「
在「
在「
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。