基于双目视觉的小场景三维轮廓提取*
2019-11-18李兴坤肖世德董庆丰
李兴坤, 肖世德, 董庆丰
(西南交通大学 机械工程学院,四川 成都 610031)
0 引 言
机器人技术是一项综合性的、交叉性的技术,涉及领域十分广泛,其中导航技术是实现移动机器人智能化和自主化关键的一环。目前有适应各种不同环境的多种导航方式,常见的导航方式有激光导航、惯性导航、磁导航、视觉导航、全球定位系统(global positioning system,GPS)导航等[1]。当前GPS导航广泛应用于城市规划道路下车辆和行人的导航,具有很高的智能性和成熟度。但自主式移动机器人所面临的环境具有较高的未知性、随机性和复杂性。由于视觉传感器获取的图像信息量大,特征丰富,安装方便,是机器人自主导航的重要手段[2]。人眼观察三维世界时,由于几何光学的投影,同一物体在两眼的视网膜上产生的影像之间存在生理视差,它反映了客观景物的深度[3]。双目立体视觉系统即是通过两个视点观察同一场景获取两幅图像,根据三角测量原理计算左右视图对应像素点间的视差(disparity),获取深度信息,从而实现场景三维重建[4]。完整的立体视觉分为6个模块:摄像机标定、图像获取、特征提取、立体匹配、空间信息恢复和后处理[5]。
本文采用区域匹配方法匹配左右视图,利用视差图求取场景内各点深度信息,构建三维环境,结合左视图二维轮廓特征提取环境三维轮廓,并结合模板匹配算法获取场景内主要物体的三维坐标信息,验证三维重建的准确性,为机器人实现路径修正及避障提供可参考的环境数据。
1 整体方案
三维轮廓提取的整体实现框图如图1所示。包括6个部分,本文将按照该框图分步实现三维场景的轮廓提取。
图1 方案整体框图
2 相机标定
摄像机标定是得到摄像机成像模型参数的过程[6]。摄像机参数包括内部参数和外部参数两部分。在MATLAB中可利用Stereo Camera Calibrator工具箱对双目像机进行标定。为了保证标定结果的准确性,拍摄棋盘格时应适当增加样本数量,经过工具箱筛选后,保留角度距离更为合适的图片。标定的结果保存在.mat文件中,相机标定参数保存在变量stereoParams中,部分参数如表1所示。
表1 相机标定参数
3 视差图获取
双目视觉中常用的左右视图匹配方法有特征点匹配法和区域匹配法,主要的特征点匹配方法有SIFT,SURF,ORB,等。对于三维重建来说,特征点匹配算法得到的匹配点过于稀疏,不够用于重建完整的三维场景,因此选择区域匹配法来获取视差图。利用区域匹配求取视差图的方法有基本块匹配(SAD)和半全局块匹配(SGM)。基本块匹配即累计绝对灰度差区域匹配法获取左右视图匹配点的视差的定义[7]为
(1)
式中Iright,Ileft分别为左右视图中对应点灰度,该算法常用于图像匹配算法,思路简单,但计算精度较低,一般用于粗糙处理。
半全局块匹配的思路是通过选取每个像素点的视差,组成一个视差图,设置一个和视差图相关的全局能量函数,使这个全局能量最小化,以达到求解每个像素最优视差的目的。其能量函数形式[8]为
(2)
式中E(D)为视差图D所对应的能量函数;p,q为图中的某个像素;Np为像素p的相邻像素点;c(p,Dp)为视差为Dp的像素点p的代价值cost;P1,P2分别为像素点p与相邻像素q的视差值绝对值相差1和大于1的惩罚系数;I(·)为逻辑函数,“·”为真则返回1,为假则返回0。
在半全局块匹配中,该方法强制对相邻块像素进行比较计算,这种附加约束使得视差估计比基本块匹配更加全面,因此选择SGM匹配方法。在计算视差之前,需要矫正左右视图,使相应点具有相同的行坐标,降低视差计算的复杂度。用双目相机拍摄的小场景左右视图如图2所示。
图2 左右视图
对应点间的视差与其深度有关,并随深度的增大而减小,无穷远处的视差可视为零。根据对象深度范围设置一个较小的视差搜索范围,以提高运算速度。除了视差搜索范围外,该算法还有几个重要的参数会对计算效率和视差图效果产生较大影响,根据实际应用场景合理设计核心参数:DisparityRange为[0 ,192],BlockSize为13,ContrastThreshold为0.5,UniquenessThreshold为10,DistanceThres-hold为Disabled,TextureThreshold为0.0002。得到左右图像之间的视差图如图3所示。
图3 视差
4 三维点云生成
得到视差图后,可以根据双目视觉的三角测距原理,计算场景中各点在世界坐标系中的X,Y,Z坐标值[9]为
X=xld0/D,Y=yld0/D,Z=fd0/D
(3)
式中xl,yl为特征点在左图像中的坐标,f为摄像机焦距,d0为两摄像机的基线距离,D为左右两幅图匹配点的视差。
三维点云的计算主要依据视差图和标定的相机参数。返回的坐标保存在p3D中,由于噪声和误差的存在,会有一些无效的匹配点,将其标记为NAN。为了突出后续三维场景轮廓的提取效果,搭建了一个较小的近距离实验场景,创建合理点云观察窗口,设置显示空间范围为X∈[-0.4,0.4],Y∈[-0.4,0.4],Z∈[0,0.5],坐标原点为双目相机基线中心位置,坐标轴单位为m,遍历点云数组,将无效点(NAN)过滤掉,显示重建后的三维场景如图4所示。
图4 重建的三维场景
5 三维轮廓提取
根据实际需要,机器人视觉导航中往往并不需要构建出完整的三维场景,获取主要的三维轮廓和空间划分情况即可。本文据此提出了一种三维轮廓的提取方法。该方法是在左视图二维轮廓的基础上实现的,常用的边缘检测算子有Sobel,Prewitt,Robert,Log,Canny[10],等,其中,Canny算子以其好的信噪比、高的定位精度、单边缘响应三个严格的边缘检测评价标准得到了广泛的应用。针对原场景的左视图采用Canny边缘检测[11]提出其二维轮廓。
1)利用一维高斯函数对左视图的行和列进行低通平滑滤波
(4)
2)计算平滑后图像的x,y方向的偏导数
(5)
3)利用二范数计算梯度幅值和梯度方向,设置边缘阈值thresh,thresh包含高低阈值2个元素,阈值的设定决定了轮廓提取的严格程度,高阈值取值越大图像越平滑,边缘轮廓越稀疏,为了突出三维轮廓的提取效果,显示较多轮廓,设定阈值为[0.04,0.1],选取边缘点,得到二维轮廓图如5所示。
图5 左视图的二维轮廓
二维轮廓表示为二值形式,高亮的边缘由灰度值1表示,黑暗的区域由灰度值0表示。扫描视图的像素坐标,筛选出灰度值为1的像素坐标。由图5可以看出,二维轮廓视图含有大量零值,存储零值和存储其他数值一样,都要占用空间和计算时间,考虑到直接用普通图像矩阵描述方式会造成存储空间的浪费和后续运算效率的降低,采用Sparse函数来优化
S=sparse(outlinepic)
(6)
Sparse函数将全元素矩阵outlinepic转换为稀疏矩阵S。S只存储非零值的索引和相应的数值,其逻辑表达式为
S={(R(i),L(i))1}
(7)
式中i为轮廓线上像素点的序号,取值为从1到size(S)间的整数,R(i)和L(i)为像素点的行列坐标。
点云数据存储在p3D中,p3D是一个MXNX3的三维数组,MXN表示左视图的像素矩阵的行数和列数,第三维的3个数表示对应像素点的三维坐标值X,Y,Z。根据二维轮廓图求得轮廓点的像素坐标并保存在S中,遍历S中的坐标,并提取p3D中相应点的三维坐标并保存,便获得了场景轮廓的三维坐标数组。在点云观察窗口显示出提取的三维轮廓如图6所示。
图6 三维轮廓
通过模板匹配算法可以获取场景内主要物体中心点的三维坐标,验证三维重建的精度。经典的NCC匹配算法是在目标图像中按模板图像尺寸逐步搜索子图,计算互相关值,相关值最大的位置即模板图像在搜索图像中的位置[12]。以小金属盒为例,模板图像7在搜索图像8中的匹配结果如图所示,点“*”为物体中心点的位置。
图7 模版图像与搜索图像
通过对场景内的物体进行多次模板匹配获取其中心点的平均像素坐标,并利用p3D中像素—三维坐标的映射关系,获取物体中心点的三维坐标,计算与实际测量的位置坐标间的三轴平均误差,列于表2。
6 结 论
由实验结果可以看出:通过对相机标定、视差匹配算法和三维重建技术的研究,实现了对小场景的三维重构;在此基础上,考虑视觉导航的实际需要和后续处理过程简洁性,提出了三维轮廓提取方法,仿真结果表明:该方法可以有效的提取出场景轮廓,且通过改变轮廓复杂度阈值能调整轮廓的精细程度;最后通过NCC模板匹配算法获取的物体中心点的三维坐标验证了重建场景的精度,误差显示所提方法可以为机器人的视觉导航提供简洁而充足的环境数据。后续研究即可将双目相机和机器人结合,利用双目视觉传感器采集的环境信息实现机器人移动过程中的视觉导航和轨迹修正功能。
表2 三维场景重建误差