代维康,雷 斌,2,蒋 林,2
(1.武汉科技大学 机械自动化学院,武汉 430081;2.武汉科技大学 机器人与智能系统研究院,武汉 430081)
截至2018年年底,我国公路通车里程达484.65万公里,其中高速公路14.25万公里,规模居世界第一[1]。随着使用年限的提升,大量道路开始出现破损,如果不及早检测,将会给国家和人民带来巨大的财产损失。因此,自动化路面检测系统的开发尤为重要。
裂纹(指路面裂纹)最大宽度是裂纹最具代表性的特征。在计算裂纹最大像素宽度方面,国内外相关专家学者提出了大量方法。王中宇等[2]针对表面裂纹边缘轮廓的不规则性,提出了一种分段宽度评定方法。该方法在获得裂纹的表面图像后,对图像沿纵向进行分段,然后用Ferret算法分别对每段裂纹的宽度进行评定。方志等[3]将裂纹边缘拟合成两条曲线,然后再计算每个边缘点对应的裂纹宽度,得出最大宽度点。JIN等[4]提出一种柔性核来计算裂纹宽度,首先提取裂纹骨架,将裂纹骨架作为内切圆圆心,以此来计算裂纹的最大宽度。曹梅丽[5]运用数字散斑相关原理进行像素标定与裂纹长度的像素搜索计算,进而用亚像素原理解决了测量裂纹宽度时,整像素分辨率不够的技术难点。程丰[6]在提取出裂纹对象后,用裂纹的像素点总数与裂纹骨架的像素点数的比值来作为裂纹严重程度的标准。丁宁等[7]采用K-means聚类算法将网状裂纹分成多个单分支裂纹,然后再分别计算单分支裂纹的最大宽度,这种方法能有效检测网状裂纹的宽度,相对误差为2.968%。王鹏[8]用裂纹对象的最小外包矩形的长宽比来衡量裂纹的伸展情况,该方法虽简洁高效,但测量精度较低。
计算得到裂纹的像素宽度后,需要将像素宽度转换为实际宽度。传统方法采用单目摄像头进行定高垂直拍摄,根据针孔成像模型将像素宽度转换为实际尺寸[9];也有一些裂纹检测系统采用标记物标定法,即在图像中放置一个定长标记物,通过比例换算计算出每个像素的实际宽度。
传统的像素宽度计算法更适用于单分支裂纹,需要将多分支裂纹分割为单分支裂纹后逐个计算像素宽度,计算流程过于复杂,且分割过程易引入误差,同时,传统的标定方法在实际应用中存在一定的难度,其标定条件要求的应用环境过于理想,严重影响检测速度和精度,很难满足应用需求。
笔者设计了一套双目视觉采集系统,以树莓派连接USB双目摄像头作为图像采集设备,利用socket编程将拍摄到的图片传输到计算机,通过图像处理技术获取裂纹对象。为了高度适应各形态的裂纹,笔者提出了一种基于骨架的边缘腐蚀算法,用于计算裂纹的最大像素宽度,并通过双目标定,将获取的最大宽度像素坐标转换为世界坐标,从而计算出裂纹的实际最大宽度。
在实际工程应用中,路面裂纹的形状呈现无规律性、复杂性的特点[10]。常见裂纹种类及其形状如图1所示。
图1 常见裂纹种类及其形状示意
由于骨架能够反映裂纹的拓扑结构[11],首先利用ZHANG等[12]的骨架化算法对裂纹进行迭代细化,在进行一次完整的骨架提取后,记录下迭代删除次数N,将其作为第二次细化操作的种子,再对原裂纹对象进行N-1次细化。将两次骨架化的差集记为M,然后对差集M进行基于距离的阈值滤波,去除孤立点,得到点集P。利用最小二乘法,将点集P拟合成一条相切于骨架的直线L,L的正交线与裂纹对象边缘的两个交点就是最大裂纹宽度点。在得到裂纹最大像素宽度所在的位置后,通过标定双目相机,将像素坐标转换为世界坐标,得到裂纹的实际最大宽度。整个计算流程如图2所示。
图2 边缘腐蚀算法计算像素宽度的流程
1.1.1 图形预处理
裂纹检测系统拍摄得到的原始图像存在很多噪声[见图3(a)],需要对图像进行一系列预处理,去除噪点,以获取裂纹对象。具体步骤如下所述。
(1) 对原始图像进行灰度化、中值滤波,并利用自适应阈值分割法对图像进行二值化,得到具有白色前景、黑色背景的二值图像[见图3(b)]。
(2) 利用形态学开操作,去除二值图像中细小的前景噪声[开操作是对图像进行基本的形态学组合操作(先腐蚀后膨胀),见图3(c)]。
(3) 遍历所有连通域,并计算出所有连通域的面积,设置一个面积阈值,利用面积剔除法,保留阈值以上的部分作为裂纹对象[见图3(d)]。
图3 裂纹预处理各阶段获得的图像
1.1.2 获取裂纹最大宽度位置
提取出完整的裂纹对象后,需要对裂纹进行迭代细化处理。每一次迭代细化就是对满足式(1),(2)的像素点进行删除的过程。
(1)
(2)
(3)
[f(p9)=0&&f(p2)=1]
(4)
式中:pi(i=1,2,…,9)为卷积窗口中的9个像素点,f(pi)为pi处的像素值,S(p1)为像素邻域连续两个像素值为0,1的次数。
裂纹骨架化的过程可以理解为对裂纹进行边缘腐蚀剥离的过程,每迭代一次会删除边缘上满足删除条件的像素点,直到所有像素点不满足删除条件时,循环停止。当裂纹剥离循环到最后一次时,仍然满足细化条件的像素位置为裂纹最大宽度所在位置。裂纹分步细化过程得到的图像如图4所示,图中白色为分割出来的裂纹,黑色为背景,红色为当前条件下迭代骨架后的结果。随着迭代次数的增加,可以明显发现裂纹较细位置优先实现了骨架化。
算法的整个过程需要进行两次骨架化操作,第一次骨架化是全骨架化,对裂纹对象不断迭代细化,直到没有满足删除条件的像素点为止,图片记为TN,并将细化次数N作为第二次骨架化的迭代种子数。第二次骨架化是对裂纹进行N-1次细化,细化得到裂纹骨架和一些非骨架像素点(见图5,红色为骨架),这些像素点称为最大凸点m,最大凸点的集合为最大凸点集(即两次骨架化的差集),记为M(m1,m2,m3,…)。将完成上述两次细化操作后得到的图片记为TN-1。为了更好地可视化凸点,笔者放大了最大凸点位置,如图5中蓝色点所示。最大凸点集M表示为
图5 第二次骨架化得到的裂纹图像
M(m1,m2,m3,…)=TN-TN-1
(5)
1.1.3 获取裂纹最大宽度所在方向
获取裂纹最大凸点集M(m1,m2,m3,…)后, 便可以得到裂纹最大宽度所在位置[mi为第i个凸点的坐标(xi,yi)]。利用最小二乘法对M拟合出一条切于TN的直线l1。最大凸点拟合及获取最大宽度方向如图6所示,取M上一点作l1的正交线l2,l2与裂纹边缘的交点a,b即为最大宽度所在点,由这两个点可以计算裂纹的宽度。
图6 最大凸点拟合及获取最大宽度方向示意
利用文章的方法分别对单分支裂纹和多分支裂纹进行宽度计算,将最大凸点拟合线的正交线与裂纹边缘相交的线段用红色直线标出,线段长度即为裂纹的最大像素宽度。裂纹像素最大宽度计算的效果图如图7所示。
图7 裂纹像素最大宽度计算的效果图
1.1.4 最大凸点集去噪
上述操作成功获取到裂纹的最大像素宽度,但在对最大凸点集进行方向拟合时,会因为一些非连续点的存在,最终拟合精度受到影响。造成这种情况的原因是同一裂纹存在多个最大宽度处,即同一裂纹存在多个位置宽度相同且均为最大宽度。由于孤立点的存在会严重影响拟合后直线的方向,降低了最大宽度方向的准确性。文章采取了一种基于距离阈值的M点集滤波法,去除孤立点,得到点集P,再利用最小二乘法拟合出正确的切线。
距离滤波过程采用一个大小为3的核h(见图8)与M进行卷积计算,在实际应用中利用M创建一个图像掩膜,其中凸点位置像素值为1,其他点像素值为0,为了避免浪费算力,仅对像素值为1的像素进行卷积运算。卷积计算结果D可表示为
图8 大小为3的卷积核h
D=h*M
(6)
对D进行阈值分割,得到滤波后的结果P,表示为
(7)
利用非连续点滤波法对图5(a)中的裂纹进行宽度测量,滤波前后的效果如图9所示,图中绿线表示拟合最大宽度所在方向,蓝色点为获取的最大宽度点。由于裂纹最后产生的最大凸点集中像素点的数量较少,当存在一些偏差较大的点(孤立噪声点)时,会对拟合结果产生非常显著的影响,所以必须对最大凸点集进行去噪。
图9 滤波前后裂纹宽度测量效果对比
为了得到相机世界坐标系与像素坐标系的关系,采用张正友双目标定法对双目相机进行标定[13]。标定使用的图片对如图10所示。
图10 标定使用的图片对
使用MATLAB软件的双目标定工具箱,利用上述图片进行相机标记,得到相关的相机标定参数。其标定平均误差低于0.35,标定误差计算结果如图11所示。
图11 标定误差计算结果
利用裂纹边缘腐蚀的最大宽度计算算法,得到了左摄像头中裂缝最大像素宽度对应的两个像素点的坐标,为了进一步通过双目摄像机还原裂纹实际的世界坐标,计算实际距离,通过对极限约束找到右相机上对应的最大像素宽度点所在的直线。与此同时,由于最大像素宽度点都在边缘上,通过边缘点匹配,便可以匹配到右相机上的最大宽度像素点,根据张正友双目标定结果计算最后的真实世界坐标,并利用欧式距离公式得到最后的实际裂纹宽度。
为了验证在计算裂纹像素宽度时,基于骨架的边缘腐蚀算法提高检测效率和检测精度的效果,通过双目相机拍摄200组裂纹图片并测量出实际裂纹的最大宽度(其中横向、纵向、斜向、网状、块状裂纹各200张,图片大小为1280 像素×960像素)。分别采用基于裂纹骨架的内切圆计算法[4](方法一)、基于K-means聚类划分的像素宽度计算法[7](方法二)以及基于骨架的边缘腐蚀算法(方法三,文章方法)计算出裂纹像素的最大宽度,并还原世界坐标计算裂纹的实际宽度。3种方法的检测相对误差如表1所示,平均运行时长如表2所示。
表1 3种方法的检测相对误差 %
表2 3种方法的平均运行时长 s
由表中数据可知,方法一计算裂纹像素宽度时,多向裂纹和单向裂纹的检测精度相差0.48%,该方法对裂纹形状不敏感,整体平均误差为9.03%,但由于基于骨架作为圆心进行内切圆绘制会消耗大量算力,所以算法耗时较长。方法二使用边缘拟合法[3]计算单向裂纹像素的最大宽度,对于多向裂纹,则采用K-means聚类算法将裂纹划分为多个单向裂纹,聚类过程耗时较长,且对多向裂纹进行聚类分割时会产生分割误差,使得该方法在几种方法中误差最大。
文章采用的基于骨架的边缘腐蚀算法平均相对误差为4.1%,平均耗时为0.57 s。能够在保证裂纹检测精度的同时,快速计算出裂纹的实际最大宽度,其相比于方法一,精度提高4.93%;相比于方法二,速度提升了3.2倍。试验结果表明,该算法极大地提高了裂纹检测系统的检测效率和精度,更加符合实际应用需求。
文章提出了一种基于骨架的路面裂纹最大宽度的检测算法。该方法主要有3个优点:① 结合裂纹骨架计算裂纹方向,避免了传统方法难以识别复杂裂纹的问题;② 对最大凸点集进行滤波处理去除孤点,降低在极端情况下的误差率;③ 利用双目摄像头获取图像,避免了传统方法中复杂的标注过程,极大地提升了整个裂纹检测系统的效率和准确率。文章所采用的拍摄装置在进行户外作业时仍然存在一定的难度,树莓派作为边缘设备,算力较低,很难实现实时检测,现阶段只能实现图片采集和识别的分开处理。因此,如何提高整个系统的检测速度将是接下来的研究重点。