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