黄 凯,余学才,丁建平,李亚南,唐 飞
(电子科技大学光电信息学院,四川成都610054)
列车提速,行车密度增大使得铁路运输的安全越来越受到人们关注。在铁路运输环境中,铁路导轨线路上的路障一直成为主要的安全隐患,而铁路导轨的准确识别是检测和定位路障的基础工作[1],因此如何高效且精确地识别出导轨位置对减少铁路运输事故的发生,提高铁路行车安全有着很重要的实际意义。
近些年,大部分提出的很多基于视觉的铁路导轨识别方法,在实时性和精确性方面不能得到同时满足,特别是在复杂的自然环境下,当光线和天气的情况发生变化时,铁路导轨的识别就会变得比较复杂。目前,常用的导轨识别方法有基于边缘检测[2-3],直方图均衡化和全局最优阈值分割[4]等。
文献[5]在对道路标识线识别的研究中提出了基于方向和长度上的线段判别算法[5]。本文在此基础上,利用OpenCV图像处理函数库,通过对其算法进行相关优化改进,并采用安装在列车头部上方的红外热像仪来得到红外视频图像,减少外界复杂环境的变化对导轨图像处理的影响[6],以实现快速准确地自动识别出铁路导轨。
OpenCV包含有基于C/C++语言的开源图像处理函数库,实现了数字图像处理和计算机视觉方面的很多算法,涵盖了如医学成像,信息安全,用户界面,摄像机标定,立体视觉和机器人等计算机视觉的许多应用领域。OpenCV的设计目标是执行速度尽量快,主要关注实时应用,采用优化C代码编写,能够充分利用多核处理器的优势,可以运行在Linux/Windows/Mac等操作系统上[7]。在VC++环境下使用时,可以方便地调用OpenCV相关库函数,使得VC在数字图像处理方面的功能得到了极大地扩充,优化了相关代码的编写,降低了VC的开发难度,使得相关程序的开发周期缩短。
基于OpenCV平台的导轨自动识别系统设计流程图如图1所示。
图1 导轨识别系统设计流程
当红外热像仪作为输入设备时,OpenCV中HighGUI工具包提供了一种简单的方式来处理从中实时读入的视频流,即函数cvCreateCameraCapture(),函数参数为摄像设备的ID,返回值为CvCapture*指针。之后的处理同视频文件类似,之后可以使用cvQueryFrame()函数来获取视频中的图像序列帧,其函数参数为CvCapture结构的指针,用来将下一帧视频文件载入内存,返回一个对应当前帧的指针。图2为从视频流中提取出的一帧图像。
图2 视频提取出的直道导轨图像
为了使方案满足实时性的要求,提高图像处理速度,对其预处理的第一步是灰度化处理,使之成为8位的灰度图像,以此来减少处理导轨图像的数据量。OpenCV在向灰度转换时,灰度值的计算使用加权平均值法:R=G=B=(0.299)R+(0.587)G+(0.114)B。
由于相关仪器设备的自身及外界环境的限制,还有图像在形成和处理时不可避免的存在着一些干扰信息,使得红外图像存在一定的噪声,噪声的存在使图像质量变差,掩盖目标特征,给后续的图像分析处理带来不便。因此,需要去除参杂的噪声来改善导轨图像的质量。本文采用的图像平滑处理方式为高斯滤波,它采用卷积核来与输入图像的每一个点进行卷积,将最终的计算结果之和作为输出图像的像素值。处理结果如图3所示。
图3 经预处理得到的直道导轨图像
在导轨识别过程中,图像的边缘提取至关重要。在灰度图像中,所谓边缘就是图像中局部区域灰度值变化显著的部分,它集中了目标的重要特征信息。边缘的准确提取对于后续导轨的自动识别至关重要。
Canny方法使用拉普拉斯算子,在灰度图像的处理中有着广泛的应用,无论在边缘定位精度还是抗噪的能力上都有着明显优势,与其他边缘检测方法的不同之处在于,首先采用高斯滤波器来对图像进行平滑,并用高斯算子的一阶微分来计算像素点的梯度幅值以及方向,对所得梯度幅值进行非极大值抑制,来确定边缘的像素点。最后它使用双阈值方法分别检测图像的强边缘和弱边缘,并且仅当弱边缘与强边缘相连时才将弱边缘包含在输出图像中[8]。经边缘提取后导轨图像如图4所示。
2.3.1 链码跟踪提取线段
目前常用的直线段提取方法有Hough变换,Hough变换实质为把图像空间中每一个像素点映射为参数平面内对应的直线,最后通过统计特性来解决问题,但是由于这种空间映射关系使得计算复杂度增大,实时性不高,且这种方式不能用来获得线段的端点以及长度信息。另一种广泛使用的是链码跟踪算法,通过链码表的使用,来提取线段信息,不仅方法简单,且能获得线段的长度,方向信息,非常适合对线段进行后续的判别处理[9]。
图4 Canny边缘提取直道导轨结果
链码是图像处理中出现较早的概念,根据中心像素指向它的领域八个邻点的方向来定义的,取值为0~7。本文选用OpenCV中如图5所示的链码表,当链码值加1,所指方向顺时针旋转45°。由图5可知,可以根据链码表的特点用来计算跟踪到的线段长度,当出现偶数号链码值时,表示连接的两像素距离为1,出现奇数号链码值时表示连接的两像素距离为√2。
图5 Freeman链码对应的8个方向
本方案采用由文献 [10]孙涵等人在新的基于链码的快速直线检测算法中提出的直线近似度公式[10]:设链码串的实际长度Len(ps,pe),两个端点ps,pe之间的理想直线距离 ps-pe,则该段链码串的直线近似度表示为 S=可知,当S值越大时,代表该段链码串越接近理想直线。由于实际中铁路导轨线的形状并不可能有较大的弯曲,所以在此基础上,本方案预设的阈值ST较小,这样可同时确保遇到弯道导轨时候也能准确检测到曲线信息。在利用链码跟踪线段过程采用按“向右看“准则进行,通常将链码信息保存在一维数组中,如整型数组code[],它的前两个元素存放链码串中首位像素的起始位置坐标(x,y),第三元素存放链码串中总的像素个数,从第四位元素开始存放链码序列。
2.3.2 长度及直线近似度的判断
从图像左下开始逐点向右逐行向上进行扫描,为避免像素重复检测,提高跟踪时的速度,除了对扫描过的像素进行标记,可根据上次链码值来计算下次的检测起点,结合OpenCV链码对应方向,当进入链码为奇数时,待测始点的链码为前者减2加8,为偶数时则减1加8,这里加8是为确保链码值保持在0~7之间。对链码跟踪线段形成的链码串进行分析处理,计算链码串跟踪到的线段的实际长度和理想长度,其中实际长度由链码表中链码值计算得出,而理想长度则由该线段的终点和起点坐标计算求出。将实际长度Len(ps,pe)与所设阈值LT相比,如果小于阈值,则表示线段长度过短,对识别导轨作用不大,或是杂而乱的干扰线段可直接去除。反之,继续计算出直线段近似度,并与所设阈值ST相比,如小于阈值ST,则进一步过滤掉不符合要求的线段[11-12]。
2.3.3 利用统计链码值次数判别线段
考虑到红外热像仪位于列车头部正上方,所以列车行驶方向应与铁路导轨线方向基本保持相同,或者两者之间的夹角在一很小范围之内。结合链码跟踪线段时的优势,提出在上一步链码跟踪线段得到链码串的同时,利用统计所有链码值出现的次数,并进行比较,得到的最大值可以代表线段的主要方向,来进行方向上判断,具体算法步骤如下:
步骤1 建立一个一维数组a[8]并初始化为0,数组八个元素分别用来存放链码串中链码值出现的次数,如a[i]=Ni,Ni为i出现的次数,i为0~7的链码值,即图5中的对应的八个方向。
步骤2 由于当前链码串信息存放于code[]中,所以从第四个元素开始计数,链码值i出现一次,相对应数组元素a[i]加1。
步骤3 新建一整形变量Max,并赋初值为a[0]。
步骤4 将Max分别与a[1]至a[7]进行大小比较,若Max小于后者,则将后者值赋予Max。
步骤5 经过步骤4之后,此时a[0]至a[7]中最大值已赋予Max,结合实际铁路导轨线总体方向可以由0或1或7来表示,来判断最终赋予Max最大值的是否为a[0],a[1],a[7]三者之一,否的话则表示此线段方向不对,不是正常的铁路导轨线,则应消除此线段。效果如图6所示。
2.3.4 断线的连接
经过以上方法对导轨图像处理之后,可以得到主要以铁路导轨线为主的轮廓线,但是由于噪声的干扰和前期进行的处理常常会出现线段轻微断线的现象,即一条线段中会有少许的像素缺失。针对这种断线情况提出了在断线连接前后,统计线段链码值出现次数,利用最大值的改变来衡量断线连接是否合理、准确。经断线连接后的效果如图7所示。
具体的算法表示如下:
步骤1 从左下逐点向右逐行向上扫描全图,对得到的当前链码串进行判断。
步骤2 对当前链码串中所有链码值出现的次数进行统计,通过比较得到的最大值来确定线段的主要方向。并取得当前线段的终点像素坐标,以此坐标为中心在一定范围内查找此线段外未标记的像素点,这里采用6×6的矩形范围。
步骤3 若存在这样的一个像素点,保存其坐标值,并利用OpenCV的画线函数连接这两点。
步骤4 对断点连接后,所形成的新线段进行链码跟踪,统计链码串中链码值出现的次数,得到最大值,从而获得新线段的主要方向。
步骤5 比较前后方向上的改变,求出差的绝对值若小于2,则表示方向接近,此次断线连接合理。否则,删除由画线函数连接两点之间的线段。继续寻找下一像素点,若存在则进入步骤3,不存在则进入步骤1继续循环,直到图像被全部扫描完毕。
经过以上步骤处理过的铁路导轨线在图中应为最长线段,所以最后一步再去除相对较短的线条。在原图中用加粗的实线显示出标识的铁路导轨线如图8所示。
图8 直道导轨原图中所标识出的铁路导轨线
对弯道导轨的情况,采用本文图像处理方法,实验结果如图9弯道导轨检测效果所示。
(1)图像的灰度化,cvCvtColor(src,dst,CV_BGR2GRAY);将原始图像帧转为8位灰度图。
(2)平滑滤波,cvSmooth(src,dst,CV_GAUSSIAN,3,3,0,0);对图像高斯滤波。
(3)Canny算 子 边 缘 提 取 cvCanny(src,dst,lowThresh,highThresh,3);参数 lowThresh,highThresh分别为低,高阈值,通常高低阈值之比在2倍到3倍之间。
(4)轮廓提取 cvFindContours(dst,storage,&contours,sizeof(CvChain),CV_RETR_LIST,CV_CHAIN_CODE);对断线连接后的导轨进行轮廓提取。
(5)画轮廓线 cvDrawContours(src,contours,CV_RGB(255,0,0),CV_RGB(255,0,0),100,3,8);在原图中用指定类型的实线标识出导轨轮廓线。
本文利用图像处理相关知识,对铁路导轨的自动识别进行了详细的研究。因基于OpenCV平台下,采用OpenCV函数库中的优化函数,使得本方案在实时应用性方面表现出色,采用链码跟踪线段时,利用统计链码值出现次数来完成了在方向上对线段的判断和断线的连接,最终实现了在原图中准确标识出导轨轮廓线,为后续铁路导轨线路上路障检测和定位工作的开展奠定了基础。
图9 弯道导轨检测效果
[1]REN Zhong.Railway recognition based on prior knowledge[D].Wuhan:Wuhan University of Technology,2007(in Chinese).[任重.基于先验知识的铁轨识别 [D].武汉:武汉理工大学,2007.]
[2]CHAI Shihong.Railway recognition based on edge detection [J].Railway Computer Application,2008,18(4):1-3(in Chinese).[柴世红.基于边缘检测的铁轨识别 [J].铁路计算机应用,2008,18(4):1-3.]
[3]LOU Ruixia.Study on video surveillance technology for railway roadblock[D].Chengdu:Southwest Jiaotong University,2006(in Chinese).[楼瑞霞.铁路路障视频监测技术[D].成都:西南交通大学,2006.]
[4]GUAN Peng,GU Xiaodong,ZHANG Liming.Automatic railroad detection approach based on image processing[J].Computer Engineering,2007,33(19):207-212(in Chinese).[关鹏,顾晓东,张立明.一种基于图像处理的铁轨自动检测方法 [J].计算机工程,2007,33(19):207-212.]
[5]WU Zhe,SUN Han.Lane mark identification algorithm based on fast line detection [J].Computer Technology And Development,2009,19(5):48-51(in Chinese).[吴哲,孙涵.基于快速直线段提取的道路标识线识别算法[J].计算机技术与发展,2009,19(5):48-51.]
[6]SUN Tongyi,LI Lin.Realization of moving targets detecting algorithm in infrared video images based on OpenCV [J].Informatization Research,2010,36(11):12-13(in Chinese).[孙统义,李林.基于OpenCV的红外运动目标检测方法及实现[J].信息化研究,2010,36(11):12-13.]
[7]YU Shiqi,LIU Ruizhen.Learning OpenCV(Chinese version)[M].Beijing:Tsinghua University Press,2009(in Chinese).[于仕琪,刘瑞祯.学习OpenCV(中文版)[M].北京:清华大学出版社,2009.]
[8]ZHOU Changfa,Image processing programming with VC++[M].3rd ed.Beijing:Publishing House of Electronics Industry,2006(in Chinese).[周长发,精通Visual C++图像处理编程[M].3版.北京:电子工业出版社,2006.]
[9]Rafael C Gonzalez,Richard E Woods.Digital image processing[M].3rd ed.Science Press,2011.
[10]SUN Han,RENMingwu,YANGJingyu,A fast and practical algorithm for line detection [J].Application Research of Computers,2006,23(2):256-260(in Chinese).[孙涵,任明武,杨静宇.一种快速实用的直线检测算法[J].计算机应用研究,2006,23(2):256-260.]
[11]WANG Songbo.A method of traffic lane detection and tracking[J].Computer Engineering and Applications,2011,47(3):244-248(in Chinese).[王松波.一种车道线检测与跟踪方法[J].计算机工程与应用,2011,47(3):244-248.]
[12]LU Guangquan,XU Hongguo,LI Yibing.Line segment detection based on chain code detection [J].Computer Engineering,2006,32(14):1-3(in Chinese).[鲁光泉,许洪国,李一兵.基于链码检浏的直线段检浏方法 [J].计算机工程,2006,32(14):1-3.]