张伊
智能寻迹机器人通过计算机编程可实现无人为干预的情况下在特定环境中自主行驶,是智能机器人领域内非常重要的且被广泛研究的智能移动装置。对于智能寻迹的实现目前有两种基本途径,一种是基于硬件即利用各类传感器判断方位和距离;而另一种则是基于软件即通过图像处理算法实现实时寻迹。在图像处理过程中Canny边缘检测算法是普遍运用的方法,但单一使用只对简单的室内寻迹任务有效;对于户外寻迹中复杂的环境信息和不清楚的边缘信息,还需进行HSV通道分离预处理。
一、HSV通道分离处理
(一)HSV空间的概念
HSV (Hue, Saturation, Value) 是A.R.Smith根据颜色的直观特征创造的颜色空间,可用六角锥体模型( Hexcone Model)来表示,如图1所示。HSV表示的参数分别为:色调(H),饱和度(S), 亮度(V)。
色调(H)是人们对色彩的感知中最显著、最直观的一方面,用角度度量,对应上图中的圆心角,取值范围为0°至360°,红绿蓝分别相隔120°,互补色分别相差180°。饱和度(S)表示色彩的纯度,取值范围是0.0至1.0,对应上图的半径值。亮度(V)表示色彩的明暗程度,取值范围为0.0(黑色)至1.0(白色),对应上图中的纵轴。
(二)RGB空间转换为HSV空间
传统的RGB色彩模型可分辨的色差是非线性的,相比而言HSV通道更加直观和接近人的视觉经验,因此在图像检索中经常将图像从RGB空间转换到HSV空间,变换的公式如下:
在OpenCV中,图像由RGB空间转到HSV空间可用CvtColor函数实现。
(三)HSV通道分离用于图像过滤
OpenCV下split函數可用于将图像分解成H, S和V三通道,并可以显示每个像素的H,S和V值。在图像二值化的过程中,通过对图像的HSV各通道设置阈值(如将饱和度S值在20至255之间的像素点显示为白色,即在二值化中处理为0)来过滤掉图中不重要的部分,而只留下有用的部分。在巡线任务中,HSV滤波器要滤掉中央线以外的线条。
二、在寻迹任务中实用性较高的图像处理方法
(一)图像膨胀(Dilate)
膨胀是OpenCV提供的一种基本的形态学操作,通常用于消除二值化后图像的椒盐噪声。图像中的边缘向外部扩张以填补图像中的空洞,从而消除纤细且不重要的噪声。在OpenCV中Dilate函数可实现此操作。
(二)Canny边缘检测算子
Canny边缘检测算子是由John F. Canny于1986年首次在论文《A Computational Approach to Edge Detection》中提出的一个多级边缘检测算法。这种算法可以实现从不同的视觉对象中提取有用的结构信息以减少数据处理量,目前已广泛应用于各种计算机视觉系统的开发。边缘检测的一般标准包括:
好的检测——尽可能多地标识出实际的边缘;
好的定位——标识出的边缘应精确定位在实际边缘的中心;
最小响应——图像中的边缘只能标记一次,且不因图像噪声而产生假边缘。
在目前常用的边缘检测方法中,Canny边缘检测算法是具有严格定义的, 可以提供良好可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势,成为边缘检测最流行的算法之一。
Canny 边缘检测算法可分为以下五个步骤:
使用高斯滤波器以平滑图像,滤除噪声;
计算图像中每个像素点的梯度强度和方向;
应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应;
应用双阈值(Double-Threshold)检测来确定真实和潜在的边缘;
通过抑制孤立的弱边缘最终完成边缘检测。
(三)霍夫直线检测 (Hough Line Detection)
霍夫变换(Hough Transform)于1962年由Paul Hough 首次提出,是图像处理中一种特征提取技术,通过投票算法检测具有特定形状的物体,其中经典霍夫变换用来检测图像中的直线。
Hough直线检测的基本原理在于利用点与线的对偶性。若选取笛卡尔坐标系为原始图像空间,极坐标系ρ-θ为参数空间,则图像空间中的点(x0,y0)对应参数空间中的一条正弦曲线ρ=x0cosθ+y0sinθ。若图窗中的像素构成一条直线,那么这些像素坐标值(xi,yi)在参数空间对应的曲线一定相交于一个点,所以只需要将图像中的所有像素点(坐标值)变换成参数空间的曲线,并在参数空间检测曲线交点就可以确定直线了。在此参数空间的ρ和θ坐标都被离散化使交点坐标为有限个,检测落在每个网格单元上的焦点个数是否超过阈值来确定该单元格对应的坐标(ρ0,θ0)能否对应图像空间中的一条直线。
在OpenCV下标准霍夫变换可通过Houghlines函数实现。
三、智能小车户外寻迹算法的实现
即将被检测道路的原始图像如图3.1所示,是一种很普通的由左右两种材料组成的户外路面,小车应从左图中黑箭头处出发沿虚线箭头所指轨迹行走,研究的目标是利用OpenCV下的编程从而识别出两种地面材料的分界线以完成寻迹任务,使智能小车沿分界线行走。完整的道路包括部分直线和四处转弯,如图3.2 所示。在这种户外环境中困难的是两种路面没有很清晰的颜色差别且由于地面的凹凸不平而形成很多阴影,这导致若直接在二值化的图像上使用Canny算法会产生很多噪声,以至于无法形成稳定的霍夫直线确定车的行走方向。
在本项目中智能小车用Python编程实现图像处理部分,其总流程如图3.3所示。
(一)步骤一:利用HSV通道过滤图像中的干扰和噪声
首先分别检测图窗中左侧道路和右侧道路的HSV值,结果如图3.4a和3.4b所示。左侧道路和右侧道路有不同的H值和S值,但由于它们各自的S值较为稳定,因此我们使用S通道来区分道路的左右侧。
通过调整S通道的阈值,我们可以得到不同的滤波结果,如图3.5a-3.5d所示。
图3.5d呈现的处理效果已经大体将左右路面区分为黑白区域,然而由于砖块交界处的沟痕颜色更深,在处理后的图像中呈白色,接下来将再通过HSV阈值去掉这些沟痕以及地面上深色的水渍。由于沟痕颜色明显暗于灰色路面,使用亮度(Value)值来过滤沟痕,对于阈值的尝试结果如图3.6a-3.6c所示。
图3.6中的滤波效果已经达到去除沟痕的目的,用同種阈值也可以滤掉地面的水渍,结果展示如图3.7。
上述过程已将图窗基本清晰地分为左右两部分,突出了在巡线任务中唯一需要关注的左右分界线的形状。用HSV通道滤波来实现图像的二值化以及噪声的去除大大增加了后续过程的准确度和稳定性,对霍夫线的形成有至关重要的作用。
(二)步骤二:利用膨胀(Dilation)算法去除椒盐噪声
虽然图像已经基本实现道路的左右区分,但为了更加突出分界线应使左侧道路全部变成白色。膨胀算法是OpenCV的库函数,在此用于将左半部离散的白色像素点扩大并互相粘连,使左半部图窗全部被白色填满,效果如图3.8所示。至此图窗的左右两部分已经清晰分割,这为后续方向线的形成提供了充足的准备。
(三)步骤三:利用Canny边缘检测算子提取分界线
在得到以上的结果后,Canny边缘检测方程用于描出两种颜色区域的分界线,此方程将返回一个仅边界处位置为1其余位置为0的二值矩阵,即仅将边界线显示为白色。如图3.9所示,在右侧处理完的图像中,仅中间的分界线保留下来。
(四)步骤四:高斯模糊(Gaussian Blur)的使用由于程序要求至少120个连续像素点点才会生成霍夫直线,因此需要预先使用高斯模糊方程以压缩分界线,消除分界线上的不连续点,从而得到更平滑的曲线。高斯模糊的结果如图3.10所示。
(五)步骤五:利用霍夫直线检测来生成方向线
这条更平滑的曲线可被霍夫直线检测方程所辨认。代码要求检测到120个连续像素点生成一条霍夫直线,此直线的坐标将会以极坐标表示,即方程返回的直线的坐标参数为r和θ,其中r表示原点到该直线的垂线段长度,θ表示垂线段与x轴的夹角。最后,我们可以利用霍夫变换方程计算所检测边缘直线的斜率k和截距长度L,并将其用于后续的PID控制环节决定小车的行进方向。添加过霍夫直线的效果图如图3.11-3.12所示。
本文介绍的小车寻迹算法设计过程是基于对摄像头画面的图像处理以实现识别图窗中的分界线,并生成方向线的过程。先利用HSV色彩通道对图像滤波,再利用OpenCV的图像膨胀、Canny边缘检测和高斯模糊等库函数提取图像中的分界线,最后用霍夫直线检测函数生成方向线并计算斜率和截距,从而实现了通过图像处理准确、快速地判断行走方向。该过程编程简单、易于实现,对运用图像处理解决寻迹问题有借鉴价值。然而对于各个库函数的阈值设置目前只停留于多次尝试数据,对于不同的环境需要调整。