宇文旋 赵明明 陈 龙
1.电子科技大学机械与电气工程学院,成都,6117312.中山大学数据科学与计算机学院,广州,510006
基于计算机视觉的环境感知是无人车行驶环境识别的重要手段,常见的视觉系统包括单目视觉系统和双目(多目)视觉系统。相较单目系统,双目系统不仅能获得场景的灰度信息,还能通过计算获得场景的深度信息,使无人车能够实时获取障碍物的形状、位置、姿态、运动以及与无人车自身的相对位置等关键信息,为无人车的自主运行提供支持。相较于昂贵的激光雷达系统,相机价格便宜且信息量更加丰富,因此基于双目视觉的场景深度信息提取一经提出便成为无人驾驶领域的研究热点之一。为了使无人车有更快的反应能力,必须为相机提供足够大的视野。传统的针孔成像摄像机视场角往往只有40°~60°,难以满足要求。
鱼眼镜头是一种特殊的镜头,焦距短、视角大,能够在单张照片中包含更多的信息,具有独特优势。国内外研究人员对单目鱼眼相机[1-2]、双目鱼眼相机从理论和应用方面进行了广泛的研究。双目鱼眼相机方面的研究有:褚光宇[3]研究了一般镜头的双目视觉定位模型,以此为基础讨论了基于鱼眼镜头的双目视觉定位模型;熊文莉[4]以鱼眼双目立体视觉系统为研究对象,针对鱼眼图像变形严重、匹配难度大的问题,提出了适合未经矫正的鱼眼图像的匹配算法;HENG等[5]提出了一种基于平面扫描的鱼眼镜头双目稠密匹配算法,该方法能够直接获取鱼眼图像的视差,但是需要多个预先设置好的平面来寻找环境中物体的接近位置,算法的复杂度较高。关于双目鱼眼相机的应用研究有:ZHAO等[6]提出了一种基于建筑物角点的城区建筑重建模型,基于汽车直行的位移计算出建筑高度,该方法简单直观,但是适用范围小;BOUTTEAU等[7]利用Canny算法对鱼眼图像上的车道线进行边缘检测,并将较长的线段投影到单位球面并验证能否过球心成圆,以此来判断检测到的是否为真正的车道线;此外,CAO等[8]开发了一种基于鱼眼镜头的机器人视觉导航系统并应用在自动导引运输车(automated guided vehicle,AGV)上;DRULEA等[9]利用鱼眼镜头对机器人周围环境进行了三维重建并获得了较高的障碍识别率。
通过文献分析可知,现有的结合鱼眼相机和双目系统的研究并不多,尤其在以下两个方面的研究有待深入:①基于鱼眼相机的双目系统成像模型及其与针孔双目模型的转化分析;②针对鱼眼图像矫正后像素缺失特点的图像插值算法研究。
针对以上问题,本文提出一种结合鱼眼相机模型与传统匹配算法的双目视觉算法,并通过场景深度提取试验对该模型和算法进行了试验验证。
目前大多双目视觉系统的模型都是基于针孔相机的,包括双目平行模型、双目汇聚模型、双目轴向模型等[10],其中基于针孔相机的平行双目视觉模型是现在双目系统最常用的视觉模型,图1为其示意图。图1中,两个摄像机坐标系统的各对应轴完全平行,且x轴重合,两个相平面均与世界坐标系的xy平面平行。两个镜头的焦距均为λ,两镜头中心连线称为系统的基线,其长度为B。同一个3D空间点分别对应两个相平面坐标点,这两点之间的位置差称为视差。一个3D空间点W到成像平面的距离Z称为这一点的深度。
图1 针孔平行双目视觉模型Fig.1 Pinhole parallel binocular vision model
图2为模型在xy平面的投影图,下面根据图2计算一点视差与深度的关系。由W点坐标X与其在第一个成像平面上投影点坐标X1间的三角相似的关系得
(1)
图2 针孔双目视差计算原理图Fig.2 Pinhole binocular parallax calculation principle
再考虑点W坐标X与其在第二个相平面上投影点坐标X2间的三角相似关系得
(2)
两式联立,消去X,得视差
(3)
从中可得深度
(4)
式(4)把深度与视差直接联系起来,因此在已知基线和焦距时,确定一点在左右成像平面的视差d后,就能方便地计算出其深度。
完整的双目深度提取过程是围绕上述计算模型展开的,主要包括以下4步:
(1)双目系统标定。其目的是根据有效的成像模型确定相机的内外部参数和相对位姿,以便正确建立空间坐标系中物点与它在平面上像点之间的对应关系。
(2)图像获取与矫正。图像获取是指用双目系统同步采集场景图片,因为相机在采集图像时采用的镜头类型以及制造误差的存在,使成像过程并非理想的针孔模型,所以,为了使用上述计算模型,需要根据标定参数对图片进行校正。
(3)双目匹配。根据图像的灰度特征建立左右两目图片像素间的对应,并由此得到相应的视差图像。
(4)深度信息获取。根据视差图恢复场景的深度信息,其原理如本节所述。
以上步骤不仅适用于针孔双目系统,也可用于鱼眼双目系统,但鱼眼双目系统采用了非线性的鱼眼镜头,因此不能直接使用针孔双目模型,需要研究鱼眼双目系统的模型,以及其与针孔双目模型的转化关系,进而对鱼眼图像的变形进行矫正。同时由于鱼眼镜头大畸变会导致矫正后的图像产生严重像素缺失,因此需要研究有效的插值算法。
大多数应用场合,由于鱼眼相机具有大的视野范围,故采用横向平行布局即可满足视野要求。
对于图3所示小型无人车的鱼眼双目系统,可建立图4所示模型。
图3 鱼眼双目视觉无人车Fig.3 Unmanned vehicle with fisheye binocular vision
图4 鱼眼平行双目视觉模型Fig.4 Fisheye parallel binocular vision model
模型由左右两个平行放置的鱼眼相机组成,模型中的球面表示以镜头光心为中心点的单位成像球面。平面表示实际的成像平面,球面中心与成像平面的距离为焦度f。空间一点W在左右成像平面的成像点分别为W1和W2,下面具体分析其成像过程。
与透视投影成像的过程不同,鱼眼相机的成像过程是非线性的,如图5所示。它可以被分为三步:①空间点W被映射为连接W与投影中心O的射线OW;②将射线OW线性地映射到单位球面上,得到球面透视投影图像W′;③将球面点W′非线性地映射到像平面上,得到鱼眼图像W″。球面点W′经过非线性映射得到鱼眼图像点W″,用公式形式化表示为
W″=D(W′)
(5)
图5 鱼眼相机成像原理图Fig.5 Fisheye camera imaging principle
D被称为鱼眼变形模型。D是可逆的,每一个球面点唯一地对应一个鱼眼图像点,而每一个鱼眼图像点也唯一地对应一个球面点,因此有
W′=D-1(W″)
(6)
D-1被称为鱼眼变形校正模型,如图6所示。
图6 鱼眼图像矫正原理图Fig.6 Fisheye image correction schematic
矫正鱼眼图像就是找到鱼眼图像点到球面点之间的映射关系D-1。得到点的球面坐标W′以后,再根据相机成像平面与单位球面的几何关系,将鱼眼图像转化为针孔相机模型下的图像,从而实现图3模型到图1模型的转换。
鱼眼镜头在获得大视野的同时,也产生了较大的畸变,尤其是边缘部分,图像压缩扭曲较为严重。文献[1]介绍了一种图像矫正的方法,但是在重投影的过程中,图像出现了呈网状分布的区域像素缺失。为了展示图像缺失的状况,将一张所有像素值都为255的全亮鱼眼图像按照文献算法进行矫正,结果如图7所示,其中像素缺失的点像素置为0。由图7分析可知,图像边缘处像素缺失较严重,甚至出现许多黑色区域,这使得重投影后的图像不利于进行双目匹配,需要对其进行插值计算。
常见的插值算法有最近邻插值、双线性插值等,但是算法一般要求较丰富的初始像素密度,用于重投影图像的插值效果不好。本文根据重投影图像素稀疏且不均匀的特点,结合试验,提出了一种基于邻域相似的图像插值算法。
本文设计的插值算法基于图像点周围3×3的矩阵进行插值,基本思想是:重投影后的空缺点和周围的像素点存在联系,并且趋近于周围大多数像素点的近似。采用余弦相似度来衡量近似,余弦相似度的定义如下:
(7)
其中,Vi和Vj为根据待插值点周围的像素构建的向量,θ为任意两个构造向量之间的夹角。下面结合实例,对所需向量的构建和算法原理作进一步说明。
如图8所示,在待插值点周围检测有像素的点,生成一个n×n的矩阵,n为待插值点周围有像素点的个数,计算每个行向量分别与其他向量的夹角的余弦值;然后对于余弦值的矩阵进行去0操作并把每一列相加,减去其中的最大值和最小值,再在最后形成的行向量中,找到最大值所在的列,则其在最初形成的行向量中相同位置即为要插值的像素。
图8 算法原理实例说明图Fig.8 Algorithm principle explanation
根据上述原理,实现了一种具体算法,算法的伪代码见图9。
(1)读入重投影图像image、对应的掩码mask及插值的次数times,mask表征需要处理的像素区域。
(2)获取图像的行列数,分别记为row、column。
(3)生成一个大小为(row+2)×(column+2)的空矩阵img,在空矩阵img中[(2,2),(row+1,column+1)]的位置插入image。
(4)将mask的值复制给next_mask。
(5)遍历img中[(2,2),(row+1,column+1)]的位置,即根据times,循环如下操作:①对于img(i,j),判断其是否需要插值,若需要插值,执行下一步,否则继续循环;②根据img(i,j)周围
Algorithm 1 Main steps of the interpolation algorithmRequire: vector win, pixel coordinates (x, y)Ensure: interpolated pixel img(x, y) wColumn is the column number of win. ifwColumn < 3 then img(x, y) = win(1) else A is a matrix of size 1 × wColumn arr = win·A arr = [arrT, winT] cosResult is a zero matrix of size wColumn × wColumn for alli = 1 ∶ wColumndo for all j = i + 1 ∶ wColumndo cosResult(i, j) = (arr(i, :)· arr(j, :)T)/ (norm(arr(i, :))· norm(arr(j, :))) cosResult(j, i) = cosResult(i, j) end for end for Remove zero values in cosResult and reshape it into a matrix of size wColumn× cosSum = sum(cosResult, 1) - min(cosResult, [], 1) - max(cosResult, [], 1) img(x, y) = win(max ID(cosSum)) end if After the image is restored through interpolation algorithm, do median filtering:img = medfilt2(img)
图9 算法伪代码
Fig.9 Algorithm pseudo code
8个方向在mask中值为1的位置生成一个n维向量v;③根据这n个位置生成其他n个n维向量v_neig[n],每个v_neig向量都用该位置的值进行填充;④利用与v所成夹角余弦值最大的v_neig中的值,对img(i,j)的值进行填充;⑤next_mask(i,j)的值赋为1;⑥将next_mask的值赋给mask。
(6)将img中[(2,2),(row+1,column+1)]区域的子矩阵赋值给image。
(7)用L×M大小的模板,对image进行中值滤波,并把结果再次赋值给image。
(8)返回image。
图10展示了原图到矫正图,最后得到插值后图像的整个过程。由图10可看出算法能完整地恢复图像的信息,且能较好地保留图像细节。
(a)鱼眼图像原图 (b)矫正图
(c)插值图图10 鱼眼图像原图、矫正图、插值图Fig.10 Fisheye image artwork, correction map, interpolation map
双目视觉的最终目的是提取场景的深度信息,深度信息提取的好坏可以反映出模型及算法的优劣。为了对比本文模型和算法的性能及其在实际场景中深度信息提取的情况,分别设计了模型对比试验、插值算法对比试验和场景提取试验。试验中鱼眼双目模型的视差计算全部按照图11所示过程进行。
图11 鱼眼双目系统深度提取过程Fig.11 Process of depth extraction
(1)试验目的。通过传统双目模型及鱼眼模型对场景识别的对比试验,说明鱼眼双目模型与传统双目模型在实际场景使用时,所获得的深度图像的具体差异及鱼眼双目模型相对传统双目的优势所在。
(2)试验装置。为了进行对比试验,搭建了图12所示的简易试验装置,装置包括上方两个配有普通镜头的相机和下方两个配有鱼眼镜头的相机,相机的位置相对固定。这样相机在采集场景数据时,位置基本相同。同时各相机采集图像的过程是同步的,从而尽量保证除了镜头不同外,其他变量保持一致。场景数据采集时,此装置安装于图13所示的无人电动汽车的前部。
图12 双目模型对比试验装置Fig.12 Binocular model contrast test equipment
图13 试验所用电动汽车Fig.13 Electric vehicles used in the test
(a)T形路口1 (b)T形路口2图14 试验场景Fig.14 Test scene
(3)试验过程 在校园的道路上选取了图14所示的两种试验场景,包括T形路口1、T形路口2。其中,T形路口1场景图像采集时,为了安全起见,采用了图15a所示的模拟场景,用停泊于路边的汽车来代替T形路口1右面行驶来的车辆。
(a)T形路口1
(b)T形路口2图15 鱼眼双目模型与传统双目模型对比试验结果Fig.15 Interpolation algorithm comparison test results
(4)试验结果分析。图15给出了a、b两组对比试验的部分结果,每组图像由4个图组成,包括左上方的左目鱼眼图像的矫正图,右上方的鱼眼双目模型提取的视差图,左下方的左目传统图像的矫正图,右下方的传统双目模型提取的视差图。
在a组试验结果中,由于鱼眼双目模型有更大的视野范围,所以提取的深度图像中能够分辨出路边的模拟车辆,从而为无人车的环境感知提供更多的场景信息;而传统双目模型的视野则没有覆盖路旁的模拟车辆,从而导致重要的场景信息缺失。b组试验结果显示,在T形路口2场景中,鱼眼双目模型可以利用其视野范围大的优势,得到左右两侧较大区域的实时状况,使无人车的决策有更多的信息支撑;而传统相机在这种场景下则完全发挥不了作用,其视野主要覆盖了前方没有道路的区域,从而使无人车对左右的场景完全失去感知。
(5)试验结论。通过对比试验发现,鱼眼双目模型与传统双目模型相比,主要优势在于其具有较大的视野范围,使其在交通环境中可以获得更多的场景信息。尤其在T形路口等需要无人车全面获取不同分叉口交通信息的场景,鱼眼双目模型的优势更加明显。
插值算法对比试验的目的是对比本文算法与现有算法的性能,在此选取了最近邻插值、谐波插值和连贯性插值3种算法作对比,试验以道路场景行人深度提取为目标,分别采用本文算法和对比算法对目标深度进行提取,提取过程除插值算法不同外,其他步骤严格一致,试验结果如图16所示。
由图16可知,相较于现有插值算法,本文算法提取的视差图目标轮廓清晰,层次分明,有较好的辨识度和三维信息表达能力。
为了进一步探究本文算法性能,设计了室内外场景下的深度信息提取试验。
(a)余弦相似插值
(b)谐波插值
(c)连贯性插值
(d)最近邻插值图16 插值算法对比试验结果Fig.15 Interpolation algorithm comparison test results
室外场景的试验以城市道路上的行人检测为基础,研究本文算法在实际道路场景下对行人深度信息的提取情况。为了安全起见,试验在校园道路上进行。试验中无人车以慢速行驶,前方行人进行了双臂向上、双臂张开、侧身、左向行走、右向行走等动作,无人车通过本文所述鱼眼双目系统同步采集了前方行人的图像,并分别根据本文算法提取了场景的视差图像。由于篇幅的限制,故仅给出图17所示部分试验数据,左侧为左目矫正以及插值后的图像,右侧为根据本文鱼眼双目模型及插值算法所得视差图。
由图17可见,所得深度图像能有效反映出行人的位置、行人的动作、行人距离车辆的距离、行人的运动状态等信息,为无人车的局部环境感知和安全驾驶提供了有效的数据支持。
此外,为了研究本文算法对场景对象的空间层次关系的处理能力,采用同一辆无人车的鱼眼双目系统,以人、方形铁箱、纸盒为场景对象,设计了以下室内试验。试验中鱼眼双目系统固定,方形铁箱置于相机正前方,分别采集人在铁箱后、人在铁箱前、铁箱上放置纸盒、铁箱上不放置纸盒等不同遮挡场景的同步图像,并提取视差图像。部分试验数据见图18。
(a)双手举起
(b)双手平展
(c)侧身
(d)左行
(e)右行图17 室外场景试验部分图像Fig.17 Outdoor scene experimental results
如图18所示,试验对象在视差图中明显可辨,对象之间的遮挡和层次关系明确,且与实际情况相吻合。说明本文算法能较好地反映对象的空间布局,有利于无人车应对实际场景下的复杂环境。
(a)人在铁箱后
(b)人在铁箱前
(c)铁箱上放置纸盒
(d)铁箱上不放置纸盒图18 室内场景试验部分图像Fig.18 Indoor scene experimental results
本文对无人驾驶车辆的鱼眼双目环境感知进行了研究。首先,对双目相机的原理进行了简要介绍,分析了鱼眼双目系统模型与针孔双目模型的转化关系;其次,提出了一种用于鱼眼相机图像矫正的余弦相似插值算法,算法以余弦相似衡量待插值点与周围灰度已知点的相似性,对因重投影产生的像素缺失进行了有效插值;最后,通过对比试验对本文模型和算法进行了验证,并探究了本文算法在室内和室外实际场景下的深度信息提取情况。试验结果证明了本文模型和算法的合理性和有效性,研究成果对于扩大无人车的视野、提高无人车的环境感知能力有重要作用。