游佳兴,黄鲁
(中国科学技术大学 电子科学与技术系,安徽 合肥 230026)
摘要:在单目视觉避障系统中,利用红色LED水平光条照射前方障碍物,由摄像头获得图像并处理后得到红光光条,根据光条中心在图像中的位置判断障碍物与摄像头之间的距离。该文对Zhang并行细化算法进行了改进,以适应嵌入式系统快速准确得到红光光条的中心线,由中心线坐标得到障碍物距离及宽度。实验结果证明,该算法具有很好的中心线提取效果;测距范围为25 cm,测距误差在3 mm以内。
关键词:openCV;中心线提取;测距;单目视觉
0引言
目前,扫地机器人避障是非常热门的研究领域,与传统的超声波、红外测距[1]相比,视觉传感器可以得到更多的环境信息;单目视觉系统具有成本低、体积小的特点,适合于扫地机器人。单目视觉避障的方法主要有单目图像还原3D场景[2]、特征检测[3]、结构光测距。本文利用红色LED矩形光条照射前方障碍物,根据光条中心在图像中的位置来判断障碍物距离。
图1(a)、(b)所示分别为距离障碍物5 cm和10 cm的情况下摄像头获得的图像。由这两个图像可知,不同距离下的光条中心在图像上的位置不同,从而达到测距的目的。
1中心线提取
目前中心线的提取算法主要有以下两种:
(1)基于距离变换的方法[4]。建立红色光条的距离场模型,提取距离场中的局部极值点,然后细化处理得到的中心线。该算法的优点是精度高,适合三维场景;缺点是计算复杂度高,实时性较差。
(2)二值细化法[5]。该算法将得到的红色光条二值化,利用迭代的方法从边界开始逐渐删除,直至得到中心线。该算法的优点是实现简单,速度快,可反映各个光条的形状;缺点是如果边界有许多毛刺将会出现除中心线外其他的分支。
由于本单目视觉避障系统是用于扫地机器人上,要求测距精度较高、实时性好,因此本文采用二值细化法。提取光条中心线的步骤如图2所示。首先在Open Source Computer Vision Library(openCV)中利用HSV颜色空间将红色光条提取出来[6],如图3所示,将红色光条部分的像素值置0(黑色),其他背景的像素值置255(白色)。针对边界出现毛刺会影响中心线提取的缺点,对提取出的红色光条图像进行开运算,消除边界毛刺的影响。
1.1图像开运算去毛刺
开运算是图像形态学中的先腐蚀后膨胀的结果,开运算可以在不改变光条基本形状的情况下平滑边界,消除边界毛刺,避免中心线出现分支。本文利用openCV自带的腐蚀函数cvErode(src,dst,element,1)和膨胀函数cvDilate(src,dst,element,1)来进行开运算操作。其中src为原图像,dst为处理后的图像,element为腐蚀膨胀窗口的形状和大小(在本文中,选择的是10×10的矩形窗口),最后一个参数为膨胀腐蚀的次数。
1.2中心线提取算法
本文算法的思想是迭代删除光条的上边界和下边界,且保证中心线上的像素点不会被删除,直至得到光条的中心线。
将开运算处理后的二值图像归一化,利用openCV内的函数cvThreshold,光条部分的像素值为1,其他为0。为了判定像素值为1(光条部分)的点P1(i,j)是否为边界,取其周围3×3的窗口内的像素点作为判定,如表1所示。遍历光条中的所有像素点,根据3×3窗口内P1(i,j)周围8个像素点确定其是否为上边界或下边界,如果是则将其像素置0(删除边界),最终得到水平方向垂直宽度为1的中心线。
算法将迭代分为两个部分:第一部分是将光条的上边界删除,第二部分是将光条的下边界删除。将位于光条上边界的点P1(i,j)置0的条件为:(1)B(P1)≤6;(2)A(P1)=1;(3)P2=0 && P6≠0。
其中,B(P1)为P1点周围8个像素点中为1的个数,即:
B(P1)=P2+P3+P4+P5+P6+P7+P8+P9
A(P1)为P2,P3,P4,…,P8,P9顺序中01序列的个数,如图4(a)所示,A(P1)=1;图4(b)所示,A(P1)=2。
如果P1点不满足上述3个条件中的任何一个,则该点不属于上边界,P1点将不会被置0。位于光条下边界的点满足的条件与上边界的条件类似,只是条件(3)有所改变:
P6=0 && P2≠0。
对于条件(1),如果B(P1)>6,则该点肯定不在边界上,如图5(a)所示,该P1点满足条件(2)和条件(3),但是该点明显位于中心线上,不能置0,所以需要满足条件(1)。对于条件(2),如果出现图5(b)所示的情况,该情况满足(1)和(3)两个条件,但是该P1点是位于中心线上,不能置0,由图可知A(P1)=2,不满足条件(2),该P1点不会被置0。因此,条件(1)和(2)都是为了保护中心线上的点不会被置0而被保存下来的必须条件。
在满足条件(1)和(2)以后,确定P1点不在中心线及光条内部(B(P1)=8的情况),如果满足条件(3),说明P1点位于光条的上边界,则该点会被标记并置0。同样,条件(3)′确定P1点位于光条的下边界。如图6所示为该算法得到中心线的例子,其中“*”代表标记置0的边界,先标记上边界并置0,再标记下边界并置0,迭代以上步骤,直到得到图6最右图片的中心线为止。
图7所示为程序的流程图,vector M的初始值为0,即size(vector M)=0。
2根据中心线坐标求出距离
图8所示为摄像机透视投影模型,其中,ABCD为图像坐标系,A′B′C′D′为实际坐标系,机器人的前进方向为X′轴方向。O点为摄像机位置,O′为LED所在位置,OO′的距离为h,G点为图像中心,G′为G点在实际坐标系的投影点,摄像机的俯仰角即∠G′OO′为θ,P点为1.2节中得到的中心线上的一点,相对于G点的坐标为P(x,y),P′为P点对应的实际坐标系上的点,Dx为X′轴方向上P′与机器人之间的距离(即障碍物与机器人之间的距离),Dy为P′在Y′轴方向上的距离(即障碍物的水平距离)。
由图8可以得到Dx和Dy的距离公式如式(1)和式(2)所示,其中,(x,y)为P点相对于图像坐标系中心G的坐标,dx和dy分别为图像坐标系水平和垂直方向上的坐标点距,f为摄像机焦距。dx、dy、f为摄像机参数,通过标定得到,如表2所示。
3实验结果及分析
为了检测算法的有效性,选取了前方障碍物为纸盒的环境信息。图9(a)表示具体的环境信息图片,(b)为摄像头获得并处理后的红色光条的图像,(c)为本文算法得到的中心线,(d)为Zhang并行化细化算法得到的骨架中心线。如图9(d)所示,由于Zhang并行细化得到的是骨架中心线,是在两个方向上对图像进行细化,如果光条宽度不一致,就会得到竖直方向的分支,且会缩减中心线的长度,这样会给机器人避障带来很大的误差(中心线的位置代表障碍物的位置)。
如表3所示,P(x,y)为图9(c)中两条中心线上的其中一个点相对于图像中心的坐标。根据式(1)、式(2)测得障碍物距离。两个盒子与机器人之间的实际距离分别为5 cm和10 cm,水平实际距离分别为8 cm和11.5 cm,结果如表3所示,其中Dy为正代表障碍物在机器人中心左边,负为右边。测距误差在3 mm以内。在ARM CortexA8,CPU主频为1 GHz,内存为512 MB的开发板中,对于图9(a)所示的环境信息,该算法的运行时间为0.23 s。
4结束语
本文针对单目视觉避障系统提出了一种快速的测距方法,算法处理效果好,测距精度较高,在嵌入式系统中能够较好地保证实时性,但在算法的处理时间上还需改进。在未来的工作中,可以通过提高硬件要求来改进算法,改进算法的方案是增加中心线算法窗口大小,使每次迭代删除的边界更多,缩短运算时间。
参考文献
[1] 曹小松,唐鸿儒,杨炯. 移动机器人多传感器信息融合测距系统设计[J]. 自动化与仪表,2009,24(5):48.
[2] LIN Z, DAVIS L. Shapebased human detection and segmentation via hierarchical parttemplate matching[J]. Pattern Analysis and Machine Intelligence,2010,32(4):604618.
[3] SAXENA A, SUN M, NG A Y. Make 3 D: Learning 3 D scene structure from a single still image[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence,2009,31(5):824840.
[4] SHARF A,LEWINER T,SHAMIR A,et al. Onthefly curveskeleton computation for 3D shapes[J].Computer Graphics Forum,2007,26(3):323328.
[5] PALAGYI K,KUBA A. A parallel 3D 12subiteration thinning algorithm[J]. Graph Models Image Process,1999,61(4):199221.
[6] 汤一平, 宗明理. 基于双色反射模型的彩色结构光颜色识别的研究[J]. 计算机学报,2013,36(9):19081916.