易焕银,刘志明,覃明俊
(广东交通职业技术学院机电工程系,广东广州510800)
压缩弹簧在各类弹簧中应用最为广泛,号称“簧中王”,在很多机构中担负关键任务[1]。对各类目标的参数检测是机器视觉的一个重要研究方向[2],关于弹簧这一零件的机器视觉检测,文献[3]提出了一种扁弹簧分类和扭转角度质量视觉检测方法;文献[4-7]设计了测量弹簧内外径尺寸的视觉系统;文献[8-9]提出了检测弹簧座组件跨度、承载座尺寸和缺陷的视觉系统;文献[10-11]开发了基于视觉的弹簧缺陷检测系统。以上方法和系统以检测弹簧内、外径等参数及各类缺陷为主。
弹簧线径指弹簧钢丝的直径,对弹簧的硬度、寿命、弹性耗能等性能有着决定性影响。关于弹簧线径的检测技术,文献[12]公开了一种检测弹簧线径是否符合图纸要求的装置,使用时需把弹簧钢丝插入装置本体,通过能否插进各个通端孔来判断弹簧线径是否合格。该方法属于机械接触式测量,效率较低且无法测出弹簧线径的具体数值。文献[13]开发了一种检测弹簧圆度、轴向直线度与表面质量的视觉系统,采用Hough变换[14]检测弹簧线两测的直线并由其距离得出弹簧各段的线径。该方法检测线径有两个问题:(1)弹簧边沿为曲线,Hough直线检测稳定性不足;(2)无法给出每个检测点位的线径及缺陷。针对一种特殊的汽车弹簧的逆向工程问题,文献[15]开发了一种压缩弹簧视觉测量系统,该系统可测量各个位置点的弹簧线径,但测量效率较低,单个弹簧的测量时间长达150 min。
目前弹簧线径的测量以采用游标卡尺等手工方式为主,存在工作效率和稳定性低且一般只对局部点位进行抽查检测的问题。为克服现有技术在测量效率和检测密度方面的不足,本文作者分析压缩弹簧的成像特征和机器视觉测量弹簧线径的难点,以弹簧中段部分近似直线的特征为出发点,以提取关键拐点为突破口,提出一种对压缩弹簧中段线径进行快速、高密度测量的方法。该方法单次测量可以在200 ms内完成数百个以上的弹簧中段线径的测量。
图1所示为典型的压缩弹簧。压缩弹簧为螺旋形状,视觉成像后有如下特点:整体为不规则曲线;在两端各约一圈的区域,弹簧线重叠度较高;在弹簧轴线两侧的区域,弹簧线不规则弯曲、部分重叠;在轴中心线附件的区域,弹簧线近似为直线;弹簧中线各段近似直线部分的长度差异较大。
图1 压缩弹簧
由于弹簧视觉成像的以上特点,文中问题的难点在于:(1)如何排除弹簧的非直线及重叠部分的干扰;(2)如何将各中段分开后进行分别测量,同时尽可能多地保留接近直线的部分以增加检测点位的数目;(3)如何确定生成指定密度的检测线段的数目、位置和方向。
图2所示为方法的结构图,由5个模块构成:图像采集模块、图像预处理模块、关键拐点获取模块、中段边沿直线拟合模块和中段线径测量模块。
图2 文中方法结构图
图像采集模块用于获取弹簧的外观图像,包括工业相机、镜头、光源和计算机,其中光源的选型和调节是关键。实验中工业相机采用CMOS面阵相机,光源采用亮度可调的LED背光源,调光时在不损伤弹簧边沿的条件下尽量增加背景亮度。图3所示为采集到的弹簧图像。
图像预处理的目的在于提取弹簧的边沿部分并去除背景中的噪点,包括如下4个步骤:
(1)对原图进行二值化阈值分割。由于采用背光源且打光时已将背景打亮,因此采用简单快速的固定阈值进行二值化;
(2)对二值图像进行形态学膨胀处理。结构化元素的尺寸不能过大,一般使用3×3的矩形,否则可能会引起边沿粘连而减少算法检测的点位数;
(3)使用膨胀图减去原图获得弹簧边沿。针对此问题,对比Canny、Sobel边沿提取算法,采用膨胀图减去原二值图的方法所获取的弹簧边沿更加完整、稳定;
(4)利用连通域分析[16]去除噪点。进行连通域分析后,保留面积最大的连通域。图4所示为图像预处理后的结果。
图4 图像预处理后的结果
获取关键拐点的主要过程如图5所示。关键拐点指弹簧边沿内侧的拐点,是弹簧各段之间的交界点,如图5(d)中蓝点所示。关键拐点的获得是此算法的一个核心,是后续删除弹簧非直线段部分以及将整个弹簧的各段分开并生成检测基线等关键步骤的基础条件。该模块的实现较为复杂,包括如下9个步骤:
(1)获取弹簧的最小外接矩形,记为RECT,其4个顶点存放到数组rect的4个元素中:rect[0]、rect[1]、rect[2]、rect[3],并调整4个顶点的顺序,使得rect[0]、rect[1]为长边(记为线段L1),rect[2]、rect[3]为长边(记为线段L2),rect[0]和rect[3]为短边(记为线段L3),图5(d)标注了各边和顶点;
(2)将弹簧边沿在靠近外接矩形RECT短边的两侧断开,使得弹簧边沿分成2个易于分别处理的子边沿。记RECT的两条长边L1、L2的中线为L4,求L4与弹簧边沿的靠近RECT的短边两侧的交点,记为P1、P2;将2个交点P1、P2沿中线方向的小块区域置零;
(3)获取第1个子边沿BW1,如图5(a)所示。方法为对步骤(2)的结果图进行连通域分析并保留最大连通域;
(4)获取第2个子边沿BW2并调整与BW1的位置关系。首先使用步骤(2)的结果图减去步骤(3)的结果图后保留最大连通域,然后以2个边沿的重心到L1的距离为依据调整BW1和BW2的位置关系,使得BW1更靠近L1,BW2更靠近L2;
(5)断开第1个子边沿BW1,如图5(b)所示。方法为先求L1和L4的中线L5,再将线段L1、L5包围的矩形区域置零;
(6)获取第1部分关键拐点集合1,如图5(c)中实心圆点所示。方法为求图5(b)中各连通区域中离L1最远的点;靠近交点P1、P2的2个伪拐点被排除,排除方法为计算潜在关键点与步骤(2)中P1、P2的距离,如果过近,则认为不是关键拐点;
(7)断开第2个子边沿BW2。先求L2和L4的中线L6,再将L2、L6包围的矩形区域置零;
(8)获取第2部分关键拐点集合2。操作方法与步骤(6)类似,求步骤(7)中每个连通区中距离L2最远的点;
(9)合并关键拐点集合并进行排序、清理,如图5(d)中蓝点所示。排序:距离短边L3由近到远排序,图5(d)中用拐点处圆点的大小表示。清理:若两端连续出现集合1或集合2的元素则只保留靠近另一个集合元素的那个,使得在合并、排序后的集合中交替出现集合1和集合2的元素。
图5 获取关键拐点的主要过程
中段边沿直线拟合时,首先删除弹簧非直线及弹簧线重叠的部分,再将各段边沿分开,最后进行直线拟合。该模块的实现步骤如下:
(1)断开弹簧两端线径无法测量的部分。首先分别以关键拐点集合中第1个和最后1个点为圆心、以背景色为填充色绘制实心圆;求以上两点到L1和L2的两对垂足,以每对垂足为端点绘制背景色直线;
(2)删除弹簧两端部分,连通域分析后保留最大的2个连通域;
(3)删除弹簧靠近边界的非直线部分。首先,分别以L1、L2的2个端点和关键拐点集合中对应集合1和集合2中的关键点获得2个闭包络区域,然后调用闭包绘制函数(如OpenCV的drawContours函数)将2个闭包区域置零;
(4)进一步删除弹簧靠近边界的非直线部分。将线段L1、L5包围的矩形区域内的所有像素点置零,将线段L2、L6包围的矩形内的所有像素点置零;
(5)将分属于弹簧不同段的边沿分离,如图6(a)所示。方法为以各关键拐点为圆心绘制背景色的实心圆;
(6)对各段边沿进行排序。首先通过连通域分析获得各段边沿的重心,然后以各重心到短边L3的距离从小到大排序。图6(a)中不同大小的圆点为各段边沿的重心,离L3距离越远的点越大;
(7)对每个连通域分别进行最小二乘直线拟合,拟合结果如图6(b)中各穿过边界的直线所示。图6为中段边沿直线拟合的2个主要过程。
图6 中段边沿直线拟合的主要过程
该部分基于关键拐点集合和各段边沿拟合直线生成检测基线,再根据预设检测密度生成检测线段,最后完成线径检测与结果显示,包括如下4个步骤:
(1)获取检测基线,即弹簧线两侧边沿的中线,结果如图6(b)中的各段弹簧中间的线段所示。首先进行直线配对,依次检查相邻的两条拟合直线,若对应的2个边沿的重心到L3的距离都落在关键拐点集合相邻的2个关键点到L3的2个距离之间,则配对成功;然后求取以上2个关键拐点分别到配对成功的两条拟合直线的两对垂足,并分别求取每对垂足的中点,即为检测基线的2个端点。
(2)完成各段弹簧线的线径检测,如图7所示,与检测基线垂直的细线段为检测线段,其上的红点为边界点。以步骤(1)中的检测基线为中线,以两边的2条拟合直线距离的1.8倍为检测宽度生成检测线段;以预设检测密度为步长向检测基线的另一端移动检测线段,进行弹簧线径检测;检测时以检测线与前景相交且最长的一段为弹簧线径,相交点为边界点,2个边界点的距离为该位置线径。说明:①若检测线未检测到2个前景点(检测基线的两端),则认为该段不是弹簧线的近似直线部分而不进行测量;②若检测到的2个前景点的中点不落在2条拟合直线之间(常见于2段弹簧的交界处),则将该对点判为误检测点排除。
图7 检测线段与边界定位结果
(3)修正检测结果,比较奇、偶数段测量数据的平均值,以平均值较小的为基准修正平均值较大的各段数据。原因:弹簧有一定的高度,各个被测弹簧中段离镜头的距离交替发生远、近的变化,从而形成视差;由于测量时采用贴放在实验台底座上的直尺来标定像素当量(每像素对应的实际物理尺寸),使用离镜头较远的各段数据修正离镜头较近的各段数据(测量值偏大)。
(4)检测结果如图8所示,在各检测基线的首端附近标注各检测段的编号,用于后续检测数据列表各行与各检测线段位置关系的确定。编号绘制方法:①求各检测基线的首端和尾端的中点;②求各检测基线的首端与长边L1和L3的距离;③求中点到较小距离对应长边(此例中奇数段对应L2,偶数段对应L1)的垂足;④以垂足为参数调用文字绘制函数(如OpenCV的putText函数)绘制相应的部位。
图8 检测结果图像显示部分
通过两项实验来评估文中方法的测量精度和在不同检测密度下算法运行速度的变化情况。
由于手动检测难以保证高密度精确移动,以较为稀疏的80像素为检测密度对图3所示的弹簧进行测量,再用电子游标卡尺(测量精度0.01 mm)对相应位置点进行手工测量。算法测量结果如图9所示,共完成了22个位置点的线径值测量。由表1可知:最大绝对误差为0.04 mm,最大相对误差为2.84%,达到了测量精度的基本要求。
图9 测量精度实验的检测结果
表1 测量精度实验数据
导致存在误差的主要原因是光学成像问题,一方面打光无法完全保证成像后的边沿与弹簧线的真实边沿完全一致,另一方面对检测结果的修正操作并不能完全消除成像“视差”的影响,后续拟采用远心镜头替代该修正方案。另外相机存在一定的畸变等其他硬件因素导致测量结果存在误差。
实验便携式计算机型号:华硕FX86F,CPU主频:2.2 GHz,RAM:8 GB。首先以图3中所示的弹簧为对象,随机摆放并抓拍100张图像;然后,以不同的检测密度(即检测线段之间的距离,该值越小检测密度越高)进行批量测试。使用C++实现的该算法平均运行时间如表2所示。
表2 不同检测密度下算法的运行时间
由表2可知:随着检测密度的增加,算法运行时间小幅度增加。检测密度为5像素时最慢(平均检测点位数为403个),算法平均运行时间为130.3 ms;检测密度为80像素时最快(平均检测点位数为21个),算法平均运行时间为120.4 ms。虽然二者检测密度相差16倍(平均检测点位数相差近20倍),但检测速度变化仅为7.60%,说明由于增加检测密度所增加的运算量并不大,检测速度受测量密度调整的影响较小。
一方面,为说明此算法完整的使用方法,下面通过基于MFC和OpenCV实现的检测系统并以图3所示的对象的检测结果为示例,介绍算法应用时的输出格式样式和各检测位置线径数据的查看方法。
另一方面,作为文中方法的一个应用场景,分别以2个不同型号的缺陷弹簧为例,演示该方法对压缩弹簧局部点位的线径过细和过粗2种异常情况的缺陷检测能力。
图10所示为检测结果的软件显示界面,左侧为结果图片,右侧为数据列表。
图10 检测结果的软件显示界面
左侧结果图片的显示信息分为三部分:(1)左上角以文字的形式显示检测到的最小和最大线径及阈值,若在范围内则显示OK,否则显示NG;(2)右上角显示该弹簧检测是否通过结果,若所有检测点的线径值都在预设的阈值范围内则显示OK,表示通过,否则显示NG,表示不通过;(3)中间弹簧部分,在弹簧各中段部分绘制检测线段,若该检测点的线径值在预设的阈值范围内,检测线为绿色,否则为红色。检测线段上的蓝点为定位到的弹簧边界点,弹簧轴向两侧的数字表示已测量的各弹簧中段的编号。
右侧列表部分包含三部分信息:(1)段号列的规律:第1个弹簧段的编号对应左侧图中弹簧轴向两侧的编号1,然后接着是第一段弹簧的多个检测点编号,后续各段的数据格式与第1段一致;(2)最大值、最小值两列为设定的高、低阈值;(3)测量值列为线径检测结果。左侧图中弹簧各段的编号与列表中弹簧段的编号一一对应,左侧图中靠近各段编号的检测线为起始检测线段位置,实现了每个检测线位置的线径与右侧列表中的检测值的一一对应。由左侧图可见算法进行了8段弹簧中段的线径检测,要查看右边列表的完整数据需拖动列表右边的滚动条。
由于检测数据量较大,检测结果的软件显示界面截图的数据列表部分只能显示部分检测数据,表3所示为导出并整理后的完整数据。由于空间限制且图10中已有显示,表中没有列出重复度较高的阈值信息。
表3 各检测点的测量数据
分别以部分线径过细和过粗的2个不同型号的缺陷弹簧为检测对象,验证算法对缺陷位置的检测能力。
图11(a)所示为缺陷样例1原图,左上角第2~3圈部分线径偏细。图11(b)所示为缺陷样例2原图,靠近中间的一小段部分线径过粗。
图11 缺陷样例原图
图12(a)为缺陷样例1的检测结果。算法成功检出线径过细的部分,红色线段标出了检出低于阈值的线径部分。图12(b)为缺陷样例2的检测结果。算法成功检出线径过粗的部分,红色线段标出了检出高于阈值的线径部分。
图12 缺陷样例检测结果的软件显示界面
针对目前弹簧线径测量方法效率低、测量密度小的问题,提出了一种基于机器视觉的压缩弹簧中段线径的测量方法。通过实验验证,该方法能够在200 ms内完成数百个的检测点位的线径测量,测量密度和效率远高于传统的弹簧线径测量方法,且具有较高的测量精度。通过转动弹簧前后3次左右的测量,该方法可完成压缩弹簧整个中间部分的线径测量。但由于成像粘连,该方法无法测量压缩弹簧两端各1圈左右的部分以及拉伸弹簧的全部。