周思达,谈海浪,唐嘉宁,蒋聪成
(云南民族大学 电气信息工程学院,昆明 650500)
在即时定位与即时建图(SLAM)中,三维重建是地图构建的重要组成部分,即时地图构建是实现移动机器人自主化的核心技术之一.目前,有关即时三维地图构建技术的应用逐步由室内小规模环境向室外大规模环境发展.相比之下,室外大规模环境由于所需传感器作用距离远,环境非结构特征显著,因此更加复杂,实时构建的难度更大.为此,将立体视觉传感器用于室外三维重建具有重要的研究意义,而通过双目立体匹配得到精确视差图成为了三维重建的主要研究内容.
近年来,三维重建研究领域产生了不少新方法[1],如基于深度相机的三维重建方法[2],基于深度学习的三维重建方法[3]等.在视觉测量、工业生产、人工智能、大规模SLAM等各个领域有着广泛的应用.基于双目视觉的三维重建大致可按照如图1的工作步骤进行.
一般来说,基于双目视觉的三维重建的效果仍要受到立体匹配方法[4]所得到视差图以及视觉传感器的影响,而有关视觉传感器的工业制造技术和相机标定方法[5]相对成熟,因此获取精确的视差图是实现室外三维环境重建亟需解决的问题.对于获取视差图的匹配方法,存在几类经典的匹配方法, 如半全局立体匹配(SGBM)算法、块匹配(BM)算法以及绝对差之和(SAD)算法[6].利用立体匹配得到的视差图或多或少都会受到光照等环境因素影响,出现失真、空洞等误差.因此,进一步优化立体匹配得到的视差图必不可少.视差图优化的方法可大致分为3类,基于深度卷积网络的方法、基于最优化理论的方法、基于滤波器的方法.如Song等[7]提出一种基于卷积神经网络的立体匹配视差优化训练的方法,利用视差不连续信息来优化视差图,在一定程度上提高了视差的精度;Yang等[8]在基于深度学习的基础上提出了传统的图像处理 技术与深度学习相结合的立体匹配方法.基于深度网络的方法往往需进行大量数据训练,且与视差匹配一体而不再已有视差图的基础上优化.Wang等[9]提出一种基于区域协同优化的匹配算法,该方法得到的视差图精度较高;Reynosa[10]等通过利用进化优化算法估计视差图,并将全局图像特征作为描述符,可估计出精度较高的视差图.基于最优化理论的方法需不断迭代优化,计算代价较高.基于滤波器的方法计算代价较小,可直接应用,但效果依赖于滤波器的设计,如Xu等[11]提出一种基于改进引导滤波器的视差优化算法来平滑视差图像,提高了视差图在梯度区域的平滑性并有效的保留了图像的边缘信息,但该方法在视差精度上提高的并不明显;汪神岳[12]等提出了一种双线性插值修复视差失真点,并结合了数学形态学[13]平滑方法完成进一步的细化处理,该方法在修复视差变化较大区域的失真点部分,存在误修复问题;张一飞等[14]通过搜寻距离最近的非遮挡点中较小的值填充奇异点,并采用中值滤波的方法平滑、检测和恢复视差图,该方法能恢复视差图中误匹配导致小黑洞区域,但无法解决空洞失真点所形成的较大黑洞区域且易因中值滤波过度平滑而导致视差值失真.
图1 结构图Fig.1 Structure diagram
本文将在立体匹配的基础上,对视差图进行优化,提出一种基于自适应窗的视差优化方法.通过对匹配方法得到的左右视差图进行左右一致性检测,筛选出左视差图的失真点,以失真点周围像素点为代价,比较并优化该点;对于误匹配造成的黑洞区域,分别从水平和垂直方向找到最近非零视差值的像素点,从而根据该失真点坐标以及找到的像素点坐标形成自适应的矩阵窗口并以其均值填充黑洞区域,完成对视差图的优化.由实验结果表明:本文提出的视差图优化方法,优化后得到的视差图相比优化前呈现效果有所提升且降低了误匹配率,以此重建出八叉树数据结构的三维地图准确度更高,效果更好.
本文是基于SGBM的立体匹配方法,采用校准后的图像对匹配得到原始左右视差图,通过左右一致性检测左视差图失真点,完成对视差图的优化并得到深度信息,以实现三维地图重建.
实际情况下,相机得到原始图像往往都会出现畸变,获取的双目图像对的共轭极线并不是在同一水平上,通过加入极线约束[15]条件,使得左右图像的对极线在同一水平线上,再经过一定的变换进行校准[16],纠正相机引入的误差.因此,根据相机标定后得到的相机内参矩阵、畸变参数以及相机外参(旋转矩阵和平移向量)对左右图像进行校准.具体步骤为:首先对原彩色图像进行灰度处理,得到单通道的灰色图像,然后通过调用基于OpenCV[17]的stereoRectify(1)https://docs.opencv.org/master/d9/d0c/group__calib3d.html#ga617b1685d4059c6040827800e72ad2b6立体校准函数得到校正后的旋转矩阵和投影矩阵,接着调用initUndistortRectifyMap(2)https://docs.opencv.org/master/d9/d0c/group__calib3d.html#ga7dfb72c9cf9780a347fbe3d1c47e5d5a映射变换计算函数得到X、Y方向上映射变换矩阵,最后调用remap(3)https://docs.opencv.org/master/da/d54/group__imgproc__transform.html#gab75ef31ce5cdfb5c44b6da5f3b908ea4几何变换函数得到校准后的左右图像.
本文采用基于SGBM的方法,以校准后图像对作为立体匹配原图输入,得到相对应的视差图,并获取正确的环境深度信息.
1)立体匹配原理.立体匹配是根据左右图像重叠区域所提取的特征点来建立图像对之间的一种对应关系,从而找到三维物理空间点位置,并根据左右图像所对应的二维成像点,最终得到物理空间点对应的二维视差图.
2)基于SGBM的视差计算方法原理.半全局立体匹配方法SGBM[18]主要源于SGM(semi-global matching)算法,是由Hirschmuller[19]于2005年提出的一种立体匹配方法,SGM算法是计算像素匹配点的成本,合计来自8个或者16个方向的匹配代价,根据相邻点进行计算视差,视差图更真实.方法核心步骤:匹配成本计算、成本合计、视差计算、优化及校正.SGM算法核心思想是基于最优化能量函数估计视差值,采用的能量函数如下:
(1)
式中,E(D)是半全局能量函数,p为匹配目标像素点,q是点p的邻域像素点,C(p,Dp)是像素点p与匹配点视差Dp的匹配代价函数,Dp为目标像素点对应的视差值,Dq是邻域点对应的视差值,P1是对相邻像素点视差等于1的惩罚因子,P2是对相邻像素点视差大于1的惩罚因子,P2大于P1.
根据式(1)的能量函数可知,在本质上,SGBM算法属于全局算法的一种扩展,它结合了局部和全局算法的优势,采用多条路径下的一维代价聚合问题来解决全局能量函数的最优问题,即将全局算法中的视差计算步骤简化并作为代价聚合步骤,算法既保证了精度又降低了计算复杂度.
相比SGM算法,SGBM算法是半全局块匹配方法,在计算匹配代价函数时,根据图像对中相匹配的同名像素点进行匹配成本函数计算,并通过采用块匹配算法(SAD).SGBM算法没有采用基于互熵信息的匹配代价的方法,增加了预处理方法,且SGBM算法采用SAD(sum of absolute differences)方法完成匹配代价聚合,其表达式如下:
SAD(u,v)=Sum{|left(u,v)-right(u,v)|}
(2)
其中SAD窗口的大小决定了视差图的匹配的效率和误匹配的大小,并在选定区域内通过选择匹配代价聚合的最小值的点作为与之对应的匹配点.
在双目立体匹配过程中,由于多种因素导致获取的原图 像对存在不同的遮挡区域和纹理平滑区域,可能无法计算得到准确视差,从而会造成部分视差失真或在孔洞点形成的黑洞区域,如图2所示(黑色是视差为零的黑洞区域,且颜色越接近黑色视差越小).
为了消除失真点和孔洞点,首先通过左右一致性从左右视差图检测出误匹配导致的失真点,然后根据周围像素点的视差值来填充该失真点,并提出一种均值自适应窗口的方法来修复视差图黑洞区域,平滑滤波过程采用中值滤波的方法.
图2 原始视差图Fig.2 Original parallax map
首先,遍历检测像素点w(x,y),通过左右一致性[20]检测出失真点,如公式(3)所示,若公式不成立且检测点视差不为零则为非零失真点;若公式不成立且检测点视差为零,则为孔洞点;
DL(x,y)=DR(x-DL(x,y),y)
(3)
其中,DL(x,y)表示左视差图对应像素点视差值,DR(x,y)表示右视差图对应坐标点视差值.
图3 失真点修复模型Fig.3 Distortion point repair model
第二,根据图3失真点修复模型,若式(3)不成立且不为零,则检测点w非零失真点,以该点为中心取周围邻域8个点对应的视差值,比较大小,标记出该邻域所在的最大值Nmax和最小值Nmin,并计算出最大最小平均值Nmean,表达式如下:
(4)
(5)
其中,数集A表示失真点w邻域视差值的集合.
此时有关非零失真点填充,可由式(4)、式(5)得到如下表达式:
(6)
根据式(6)可知,若DL(w)
图4 孔洞点填充模型Fig.4 Hole point filling model
第三,由图4的孔洞点填充模型可知,若检测点w的视差值为0,则标记该点为孔洞点,并分别从x,y方向遍历,直到找到视差值不为0的点wx和wy,其坐标值分别wx(x,y′)、wx(x′,y)和下角点wxy(x′,y′).令dx=(x′-x),dy=(y′-y),构造一个以孔洞点w(x,y)的坐标为起点,dx为宽,dy为高的矩阵Mdx×dy,从而形成一个可变的自适应的窗口矩阵M,于是有:
(7)
第四,根据式(7)得到矩阵M的非零元素个数n,以及矩阵M对应元素数值总和S,并求出平均值smean,表达式如下:
(8)
最后,根据上述方法步骤及公式,直到检测完所有像素点并修复好所有的视差后,进一步采用中值滤波[21]平滑去除椒盐噪声,并调用基于OpenCV库中的copyMakeBorder[注]https://docs.opencv.org/master/d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36函数进行边界处理,得到优化后的左视差图.
根据本文方法优化后的左视差图,结合标定参数和双目测距原理[22]以获取深度信息[23]并用于三维重建,而重建出的三维非结构化的点云数据是不规则、无序的,为此采用一种用于三维空间细化分层的八叉树数据结构来压缩存储点云数据.八叉树[24,25]是一种递归,轴对称且空间分开的数据结构,通过将三维地图的整体环境场景作为一个树状模型根节点,依次将每个节点分为8份,直到满足停止条件让所有节点都细分成叶子节点或达到设定的划分树枝个数,最后可达到加速分解运算且节省空间的效果,并实现八叉树数据结构的三维重建.
下面通过4个算例对本文提出的视差图优化方法进行分析.实验数据采用的是Middlebury[26]提供的4组标准图像对Venus、Bull、Teddy、Cones,以及目前国际上最大的室外自动驾驶场景下的计算机视觉方法评测数据集—KITTI的部分数据集,其中实验结果都是在相同的参数设定下完成的,4个算例实验中的灰度图,颜色越接近黑色视差越小,黑色的表示视差为零或者接近零的视差区域.
本算例通过以校准后图像对作为立体匹配原图输入,按照第3节的步骤进行失真检测和视差图优化,说明本文所提出方法的思路和工作流程:
1)通过左右视差一致性,检测出失真点;
2)若该失真点视差值不为0,则根据该非零失真点周围8像素点坐标对应的视差值,通过与该失真点的视差值作代价比较,进而优化失真点的视差,如图5(c)和图5(d)所示;
3)若筛选出的失真点视差值为0,则该点为孔洞点,且多个空洞点会形成黑洞区域,如图5中(e)所示;
4)以孔洞点坐标位起点,以X、Y方向分别遍历并找到一个非零的视差值的像素点坐标,并将X方向所找到的非零视差点的x′坐标减去起点x坐标的值记为w,将Y方向所找到的非零视差点的y′坐标减去起点y坐标的值记为h,最后在所在视差图像上形成一个以孔洞点为起点,w为宽,h为高的自适应窗的矩阵;
5)根据步骤4得到自适应矩阵,并以矩阵内元素对应的视差值与非零视差值个数的比值用于优化孔洞点,如图5(f)所示;
6)最后采用中值滤波和copyMakeBorder函数完成对上述结果的滤波和边界处理,优化后的视差图如图5(g)所示.
图5 视差图优化过程Fig.5 Disparity map optimization process
本算例采用的实验数据是Middlebury[26]提供的4组标准图像对Venus、Bull、Teddy、Cones,对其利用传统方法得到的视差图作了优化处理并与未处理前和文献[11,12,14]的视差优化结果作了对比.同时为了客观评价本文算法的处理效果,表1中数据是计算的视差结果与真实视差误差大于1的统计结果[27],其结果可用误匹配率E进行表示,如公式(9)所示.
(9)
式中:dc(x,y)表示像素点坐标(x,y)的视差值,dT(x,y)为实际视差值,δ为设定的阈值,一般为1.
实验结果如图6和表1所示,通过对实验结果分析可知,图6(a)是原始图像,图6(b)是真实视差图,图6(c)是SGBM算法得到原始视差图,图6(d)是文献[11]的视差图优化结果,图6(e)是文献[12]的视差图优化结果,图6(f)是文献[14] 的视差图优化结果,图6(g)是本文方法优化结果,根据视差图优化的图像显示以及表1中数据对比可知:本文方法对基于SGBM算法得到的原始视差图完成了优化,并降低了误匹配率;从误匹配率比较分析,本文方法相比文献[11,12,14]的方法,对于标准图像中绝大多数数据,误匹配率是最小的.
表1 Middlebury标准数据集实验结果(误匹配率%)
Table 1 Experimental results of Middlebury standard dataset(Mismatch rate %)
方法图像对名称VenusBullTeddyConesSGBM10.2210.2622.4314.00文献[11]7.834.3518.1815.08文献[12]7.586.9217.9417.18文献[14]10.4410.1616.9313.95本文7.384.6316.9114.52
图6 标准数据集视差优化结果Fig.6 Disparity optimization results of standard dataset
为说明方法对室外场景的适应情况,本节算例采用的实验数据是目前国际上最大的室外自动驾驶场景下的计算机视觉方法评测数据集—KITTI数据集.图7(a)是KITTI原始图像,图7(b)是SGBM算法得到原始视差图,图7(c)、图7(d)和图7(e)分别是文献[11,12,14]得到优化后的视差图,图7(f)本文方法优化后的视差图.实验结果表明,优化后的视差图(f)视差更密集,相比SGBM算法得到原始视差图(b)优化后的得到的视差图效果更好.其中,优化后的视差图(f)与图 7(d)相比,后者最上面出现了明显的矩形区域误差,因此,本文方法能得到较好的结果(采用的KITTI数据集没有相对应的真实视差图,因此本算法不作误匹配率分析).
图7 KITTI数据集实验结果Fig.7 Experimental results of KITTI dataset
为说明以本文方法得到的优化视差图优点,并以视差图为基础建立三维地图的情况,本节算例中通过分析由原始视差图和本文优化方法得到视差图分别完成对环境的三维重建并进行对比.图8(a)是KITTI原始左图像,图8(b)是SGBM算法得到原始左视差图,图8(c)是本方法优化后的左视差图,图8(d)是由原始左视差图重建的八叉树图,图8(e)是由本文方法优化后的左视差图重建的八叉树图.由实验结果对比分析可知,利用本文方法优化后的视差图重建的八叉树效果更好.
图8 三维八叉树地图重建比较Fig.8 Comparison of 3D octree map reconstruction
本文以双目立体视觉理论为基础,提出一种基于自适应窗口的视差图优化方法,结合KITTI数据集图像对的标定参数计算得到室外场景下的三维坐标,完成了基于八叉树的三维重建.本文方法对SGBM方法得到原始视差图进行了优化,并通过对比实验结果分析,结果表明本文方法在原本的立体匹配方法上完成了进一步优化,能有效的保证原始图像在视差图的纹理性并进一步完善了误匹配导致的黑洞区域,提高了室外环境下三维重建的真实性,以此建立的三维八叉树地图更完整、效果更好.未来将对低或无纹理区域的视差图优化开展进一步的工作.