APP下载

基于视觉SLAM稀疏点云的增强现实应用

2019-03-12廖书航

现代计算机 2019年5期
关键词:单目摄像机重力

廖书航

(四川大学视觉合成图形图像技术国防重点学科实验室,成都 610065)

0 引言

目前,市面上的增强现实(AR)应用大致可以分为3类,即基于图片或二维码的AR应用,基于人脸特征的AR应用,和基于视觉SLAM的AR应用。基于图片或二维码的AR应用将虚拟信息渲染到图片或二维码上,一般会要求事先准备一张图片或者二维码,并拍摄图片或二维码的俯视图,然后利用对极几何等知识求解出虚拟物体的渲染位置和角度[1]。基于人脸特征的AR应用提取并跟踪人脸特征,然后根据人脸特征的位置将虚拟的信息叠加到人脸上。基于视觉SLAM的AR应用则利用视觉SLAM来实时计算真实环境中摄像机的运动,用该运动来控制渲染引擎中相机的位置和角度,并结合SLAM计算出的稀疏点云来放置虚拟物体。

但是,目前大部分基于视觉SLAM的AR应用都只会利用视觉SLAM稀疏点云中一块属于平面的点云,并将虚拟物体放置在基于该平面点云拟合的虚拟平面上,一方面是因为对整个稀疏点云做网格重建会非常耗时,一方面是因为视觉SLAM估算出的稀疏点云包含非常多的噪点,对整个稀疏点云做网格重建难度很大。

本文设计了一个基于视觉SLAM稀疏点云的增强现实应用,对视觉SLAM整个稀疏点云做了网格重建,在保证了一定的实时性下,提高了AR应用与真实环境的交互程度和真实感。

1 视觉SLAM介绍

SLAM是即时定位与建模(Simultaneous Localiza⁃tion and Mapping)的缩写。根据所采用的传感器,SLAM可以分为基于激光的SLAM,基于摄像头的SLAM,即视觉SLAM(vSLAM),以及基于摄像头和惯性测量单元(IMU)融合的视觉惯性导航系统(VINS)等。一个完整的视觉SLAM系统由四部分组成,分别为前端视觉里程计、后端优化、回环检测和建图[2]。前端视觉里程计负责估算相邻图像间相机的运动以及局部地图。后端优化负责得到全局一致的摄像头轨迹和地图。回环检测模块判断摄像头是否曾经到达过当前的位置。建图模块则维护一个全局的点云地图。

2 工程实现

本文设计的增强现实应用包含4大模块,分别为渲染模块、单目视觉SLAM模块、网格生成模块,以及重力方向求解模块,运行流程见图1。

2.1 渲染模块

渲染模块使用Unity游戏引擎,用C#语言进行开发,主要负责虚拟信息的渲染、使用C#重写的OpenCV插件获取摄像头的图片、人机交互以及游戏摄像机的控制等。

在本文设计的AR应用中,游戏摄像机将模拟真实场景中摄像机的运动,这与许多基于视觉SLAM的AR应用固定游戏摄像机的方式不同。当启动该AR应用时,渲染模块会将采集的图片传递给单目视觉SLAM模块,SLAM模块会根据采集的图片计算出真实场景中摄像机的运动,再将该运动传回Unity游戏引擎。Unity游戏引擎会用这个运动来设置游戏摄像机的位置和旋转,从而让游戏摄像机和真实场景中的摄像机的运动保持一致。而真实摄像机采集的图片会放置于Unity中的一个面板上,该面板与游戏摄像机固连在一起,跟着游戏摄像机移动,充当着Unity渲染的背景。

图1 本文AR应用的流程图

2.2 单目视觉SSLLAAMM模块

随着LSDSLAM以及ORBSLAM等开源库出现,单目视觉SLAM的研究也变得火热起来。单目视觉SLAM可以分为直接法以及间接法,直接法以优化光度误差来求解摄像机的运动,可以在一定程度上应对纹理缺失的场景。间接法计算特征点描述子并用描述子来做特征点跟踪,并通过特征点匹配对求解摄像机运动,具有更高的鲁棒性。

本文的单目视觉SLAM模块使用ORBSLAM这一个间接法视觉SLAM开源库,用C++语言开发。ORB⁃SLAM是一个多功能且较为鲁棒的SLAM系统,支持单目、双目和RGBD视觉传感器。由于ORBSLAM的原生环境是Linux,而本文设计的应用是在Windows 7上开发的,所以需要做ORBSLAM的代码移植,并与网格生成模块以及重力方向求解模块一同封装成C++语言动态链接库(DLL),供Unity游戏引擎调用。需要注意的是,ORBSLAM采用右手坐标系,而Unity游戏引擎则使用左手坐标系,那么需要一个坐标变换矩阵将ORBSLAM计算出摄像机运动变换到Unity坐标系下。

2.3 网格生成模块

单目视觉SLAM计算出的关于周围场景的点云非常稀疏,在纹理缺失的地方往往没有点云对应,例如桌子的表面。如果直接使用点云库(PCL)中的泊松重建或贪婪三角等算法对上述稀疏点云进行网格重建,则会发现在纹理缺失的地方会出很大的洞。另外,单目视觉SLAM计算出的点云还带有许多噪点,这加大了网格生成的难度。

本文的网格生成模块使用开源库OpenMVS,用C++语言开发。OpenMVS是一个功能非常强大的三维重建开源库,以稀疏点云、摄像机的初始姿态以及图片为输入,通过重新提取、匹配图片中高质量的特征点以及块匹配,可以对稀疏点云进行去噪和补洞,最终生成稠密点云、网格以及纹理网格,被广泛运用在测绘以及高精度建模。但OpenMVS的网格重建往往非常耗时,所以本文对OpenMVS的代码和参数设置进行了一定的优化,并将网格生成模块放置于一个额外的线程,用于提高整个AR应用的人机交互体验。

需要注意的是,由于网格生成模块以ORBSLAM生成的稀疏点云为输入,并输出三角网格,所以最终生成的网格定义于右手坐标系,导致三角网格三个顶点的索引顺序在Unity游戏引擎的摄像机下为逆时针方向。Unity游戏引擎为了提高渲染性能,只会渲染顺时针顶点索引的三角网格,即三角网格只会显示一面[3]。此处需要交换三角网格中第一个顶点和第三个顶点的索引。

2.4 重力方向求解模块

重力方向求解模块负责计算出真实环境中重力的方向,供Unity游戏引擎使用,采用C++语言开发。由于本文设计的AR应用仅使用了一个摄像头,所以无法直接测量出真实环境中的重力方向。当摄像机对准真实环境中的一块水平平面时,点击Unity中的重力方向求解按钮,重力方向求解模块便会对属于该水平平面的稀疏点云做平面拟合,并求解出拟合平面的法向量。

具体做法为:

(1)累加点云平面中所有的三维点的坐标,求解坐标平均值,该坐标平均值为点云平面的几何中心点O,点O应位于拟合平面上。

(2)将点云平面中的三维点变换到以几何中心点O为原点的坐标系下,并由变换后的点云建立矩阵A。矩阵A的列为三维点的坐标分量,行数为点云中点的个数。

(3)设拟合平面的法向量为X,利用奇异值分解(SVD)解超定方程组AX=0便可以求出法向量[4]。该法向量的反方向便是真实环境中的重力方向。最后,将该法向量的反方向设置为Unity游戏引擎中的重力方向。

3 AR应用效果演示

本文AR应用的开发环境为Windows 7系统,CPU为Intel i7-3600QM 2.30GHz,在不使用GPU加速的情况下运行帧率可以达到10Hz以上,多线程下网格的生成大概会耗时3秒。在网格生成期间,AR应用可以与用户进行正常交互。AR应用测试的场景包含两个纸盒以及一张纹理丰富的背景图,具体的效果可以参考图2。从图2可以出,虚拟的石头可以与两个木盒进行碰撞,并且虚拟石头的阴影可以显示在盒子上,这是因为AR应用的虚拟网格是基于整个视觉SLAM的稀疏点云来生成的,而不是仅仅对属于平面的点云进行了网格重建。本文AR应用生成的网格可以参考图3。

图2 本文AR应用的演示图

图3 本文AR应用生成的网格

4 结语

总的来说,本文提出的基于视觉SLAM稀疏点云的增强现实应用在一定程度上提高AR应用与真实场景的交互程度以及真实感,但鲁棒性还不够高。

当摄像机剧烈运动或者大角度移动时,比如从桌子上方的俯视视角移动到与桌子平行的视角,虚拟物体可能会偏离真实环境的对应位置。这是因为ORB⁃SLAM中前端里程计是基于特征点的。要想计算出两帧图片间准确的摄像机运动,ORBSLAM需要较多的、正确的特征点匹配对。然而,当摄像机剧烈运动时,连续图片帧的视差很大,正确有效的特征点匹配对的数量往往不足,最终导致无法计算出摄像机运动或者计算出误差很大的摄像机运动。

可以通过将单个摄像头与惯性测量单元(IMU)融合来一定程度上解决上述问题。摄像头与惯性测量单元是互补的。摄像头可以提供丰富的信息,而惯性测量单元则可以在剧烈运动下提供较好的相机运动初值。另外,惯性测量单元中的加速度计可以测出真实尺度的平移以及重力方向,这样就不用去拟合一个点云平面来求解重力方向了。

猜你喜欢

单目摄像机重力
重力消失计划
基于单目视觉的分离图像分析方法
基于单目视觉车距测量方法综述
一种单目视觉里程计/UWB 组合室内定位方法
重力之谜
单目SLAM直线匹配增强平面发现方法
新安讯士Q6155-E PTZ摄像机
安讯士新AXIS M31网络摄像机
一张纸的承重力有多大?
如何消除和缓解“摄像机恐惧症”