赞
踩
上篇文章中,笔者给大家详细介绍了3D模型表面重建的经典算法:泊松重建。今天笔者就给大家聊一聊这个系列的真正主角:基于TSDF的实时表面重建算法。说到这里,不得不提到SLAM领域中的经典论文:KinectFusion,这篇论文中的表面重建思想和方法就是今天要讲的重建算法的核心来源。
虽然KinectFusion发表于8年前的2011年,但是这并不影响其在SLAM的细分领域:3D表面重建方向的里程碑式地位。KinectFusion的命名源于2010年6月微软发布的Kinect体感相机,其低廉的价格和出色的成像质量促使更多的科研人员可以获取和使用它来做3D相关的研究工作。让我们用下图先简单回顾一下KinectFusion的结构。
Depth Map Conversion:其实这里做了两件事情,其一,从原始深度图(Depth map)中的每一个像素点结合相机内参(Camera Intrinsic Parameter)计算出顶点坐标(Vertex);其二,使用Multi-scale方法估计出每个顶点对应的法向量(Normal)。
Camera Tracking:使用简单的ICP算法估计出相机的位姿(Translation + Rotation),输入是:当前帧顶点和法向量+光线投射法得出的顶点和法向量。
olumetric Integration:配合当前帧估计得出的相机位姿,将原始深度图转换为范围在[-1, 1]内的数值加入TSDF空间。
Raycasting:将光线投射法应用于TSDF空间中,计算物体表面顶点坐标和法线,用于渲染和下一帧的相机位姿求解。
KinectFusion中使用了TSDF空间,其实可以理解为点云的一种抽象,因为传统点云是非结构化(Unstructured)数据,而转化入TSDF空间后,变成了结构化的3D数据,好处是,可以载入GPU内存,利用GPU的多核心并行运算使实时3D重建成为可能,且一定程度减少了一些噪点,达到降噪的目地。而MantisVision的实时表面重建算法就沿用了KinectFusion中的核心概念:TSDF空间。
简单介绍一下算法的基本步骤:
1)Camera alignment
2)Depth Map Conversion
3)Volumetric Integration
4)Rendering
其实算法上只是减少了Camera Tracking这个步骤,因为我们的采集环境是由多个镜头固定在不同的指定位置,相互之间是静态的环境,所以我们加入了Camera Alignment这个步骤,利用校准板将所有镜头标定到同一坐标系下。
TSDF空间就是虚拟的创建出一个多维空间,我们这里创建的是一个三维空间,这个空间有两种标量,一种是三维空间对应真实世界的长宽高(下图左),单位是米,另一种标量是X,Y,Z轴方向上的体素(Voxel)数量(下图右),其表达的是相同尺寸空间下,空间划分的细粒度,体素数量越多,TSDF空间保留的细节越多,GPU内存的占用越多。假设我们有一张显卡拥有无限大的内存,那我们就可以使TSDF空间的细粒度提升至无限大,可以在不丢失任何细节的情况下,在GPU内存储进原始点云数据。
那TSDF空间内是存储了哪些信息呢?每个体素中都存储了一个[-1, 1]的浮点型数值。如下图,是张2D-TSDF空间的示意图,绿色图形表示的是一个固体的几何物体,蓝色的图形是相机和视野范围,白色的体素是相机视野外的未知的区域,黄色的体素表示的是(0, 1]范围内的数值,灰色体素表示的是靠近0的数值,表示的是最终的物体表面,最后粉色的体素表示的是[-1, 0)范围内的数值,表示的是当前视角下完全被遮挡的部分体素。
下面给大家整点数学公式,计算每个体素内TSDF数值之前,我们要先计算出每个相机视野内体素SDF数值(公式1),假设我们要计算上图中X位置体素的SDF数值,我们需要首先在深度图中找到X点所在的UV坐标,之后提取深度值:depth(pic(x)),最后减去X位置的深度值:cam_z(X),得到SDF值。
TSDF的计算公式如下,这里SDF值相当于乘了一个系数1/t,其范围被截断至[-t, +t]区间,使用截断t的好处是去掉一些跟表面重建无关的极大值。最终使用Min,Max函数限定TSDF的数值在[-1, 1]范围内。
TSDF多镜头的深度图融合只需要简单的把Alignment标定出的镜头位置信息应用到每一个镜头位置,然后将深度图投射入同一个TSDF空间中,使用简单的加权平均法(weighted average)方法更新叠加之后的TSDF值。
为最终得到网格化的模型,我们需要对于TSDF空间中用0值表示的物体表面进行提取,常用办法为:移动立方体法(Marching Cube)或者光线投影法(Raycasting)。
在GitHub上已经有开源代码的实现,其重建效果还算不错,有兴趣的同学可以尝试跑一下。
C++:https://github.com/andyzeng/tsdf-fusion
Python:https://github.com/andyzeng/tsdf-fusion-python
TSDF重建方法的效率非常高,但是想要获取高质量的贴图效果是非常困难的,如果只是用每个顶点坐标的颜色,差值计算出颜色,其效果比较一般,不如贴图的好。MantisVision已经在TSDF重建贴图方面取得进展,获得了优秀的视觉效果。
影响实时3D直播实现的两大要素,第一:实时性极高的表面重建算法,MantisVision已经拥有并取得了技术上的突破,第二:高效的网络传输和3D图像压缩算法,实时重建3D影像的带宽需求是极高的,因为传输流内包含了不只是3D信息,还包含了高清贴图信息,我们的每帧贴图都达到了6K左右的分辨率,所以单单5G网络的带宽也不能满足原始3D数据每秒动辄几十GB的传输带宽(采集速率在30fps),那3D信息的压缩技术在这里就至关重要了,MantisVision在这个领域也已经有了一些突破,在保证原始数据损失最小的情况下,做到了将几十GB的数据压缩到了几百MB,使之能真正使用在现实的5G商业化场景之下。
[1] Izadi, S., Kim, D., Hilliges, O., Molyneaux, D., Newcombe, R., Kohli, P., … & Fitzgibbon, A. (2011, October). KinectFusion: real-time 3D reconstruction and interaction using a moving depth camera. In Proceedings of the 24th annual ACM symposium on User interface software and technology (pp. 559-568). ACM.
[2] Newcombe, R. A., Izadi, S., Hilliges, O., Molyneaux, D., Kim, D., Davison, A. J., … & Fitzgibbon, A. W. (2011, October). Kinectfusion: Real-time dense surface mapping and tracking. In ISMAR (Vol. 11, No. 2011, pp. 127-136).
[3] Whelan, T., Kaess, M., Fallon, M., Johannsson, H., Leonard, J., & McDonald, J. (2012). Kintinuous: Spatially extended kinectfusion.
[4] Using Kinfu Large Scale to generate a textured mesh: http://pointclouds.org/documentation/tutorials/using_kinfu_large_scale.php#using-kinfu-large-scale
[5] Werner, Diana & Al-Hamadi, Ayoub & Werner, Philipp. (2014). Truncated Signed Distance Function: Experiments on Voxel Size. 8815. 357-364. 10.1007/978-3-319-11755-3_40.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。