基于深度相机的实时物体三维重建方法与流程

文档序号:13986468阅读:7445来源:国知局

本发明涉及三维成像领域,特别是一种能够实时地对物体或人体进行三维重建的方法。



背景技术:

三维重建技术一直是计算机图形学和计算机视觉领域的热点课题。三维重建就是从输入数据中建立3d模型。随着各种面向普通消费者的深度相机的出现,基于深度相机的三维扫描和重建技术得到了飞速发展。对于现实场景中的点,深度相机扫描得到的每一帧数据不仅包括了场景中的点的彩色rgb图像,还包括每个点到深度相机所在的垂直平面的距离值。这个距离值成为深度值(depth),这些深度值共同组成了这一帧的深度图像。

深度图像可以看做是一幅灰度图像,图像中的每一个点的灰度值代表了这个点在现实中的位置到相机所在垂直平面的真实距离距离。rgb图像中的每个点都会对应一个在相机的局部坐标系中的三维点。因此,深度相机的每一帧的深度图像相当于一个在相机的局部三维坐标系中的点云模型。基于深度相机的三维重建技术所使用的输入数据是rgb图像和深度图像,因此,这类技术也被称为基于rgbd数据的三维重建技术(d表示深度值,depth)。

基于深度相机的三维重建的核心问题有:1、深度相机的数据量非常庞大,如何在重建过程中处理庞大的数据。并且,深度相机所得到的深度数据是存在误差的,即使相机位置固定,现实场景中的点在不同帧中的深度值也会有所区别,那么如何估计点的最终位置?2、相机位置的估计,即如何在位置环境中通过获取周围的环境数据来确定自己所在的位置?

newcombe等人于2011年发表的“kinectfusion:real-time3dreconstructionandinteractionusingamovingdepthcamera”提出了三维重建的经典方法kinectfusion,使用迭代最近点(iterativeclosestpoint,icp)方法来解决上述核心问题。kinectfusion提出在世界坐标系中定义一个立方体,并把该立方体按照一定的分辨率切割成小立方体,使用截断有符号距离函数(truncatedsigneddistancefunction,tsdf)的方法来更新每个小网格中的一个数值,该数值代表该网格到模型表面的最近距离(tsdf值)。对于每个网格,在每一帧都会更新并记录tsdf值,通过tsdf值还原出重建模型。通过不断更新并“融合”tsdf值,来接近所需要的真实值。kinectfusion方法定义的立方体中的所有的网格中的tsdf都需要记录,即便这个网格在显示场景中根本没有点,这就造成极大的内存空间的浪费,并限制了扫描范围。

thomaswhelan等人在2015年发表kintinuous“robustreal-timevisualodometryfordensergb-dmapping”是在kinectfusion的基础上加入移动tsdf的技巧从而达到大范围场景重建,并且提出icp+rgbd匹配算法提高点云匹配精度,加入回环检测从而平摊累积误差,提高估计的相机位姿精度。

但是无论是kinectfusion还是kintinuous,都存在以下缺点:

1、未将物体或人从场景中分割出来,在重建对象为场景中的物体或人时,需要在重建后的三维模型中分割对象,分割的复杂度高,因此,不适合用于重建对象为场景中的物体或人的情况。

2、由于相机拍照的帧率是固定的,当扫描速度较快时,前后两帧相机位姿相差较大,导致kinectfusion以及kintinuous使用的icp+rgbd匹配算法匹配失败。

3、累积误差导致三维物体模型精度下降,虽然kintinuous中已经加入回环检测并且对于场景重建时能够有效的检测出回环并进行回环优化从而修正模型,但是在人体扫描过程中此种回环检测方式经常会出现错误的回环或者无回环。



技术实现要素:

本发明的目的在于提供一种能够避免icp匹配算法失效,降低累积误差提高模型精度的适用于重建指定物体或人的基于深度相机的实时物体三维重建方法。

基于深度相机的实时物体三维重建方法,包括以下步骤:

步骤1:从深度相机中按顺序获取一帧深度图像作为当前帧,对当前帧进行预处理,预处理包括在深度图像中将对象从场景中分割出来、将分割出来的对象数据去除边界噪声,将去噪后的对象数据生成有序点云和用pca(主成分分析)计算点云法向量;

步骤2:判断当前帧是否第一帧,若是,则获取相机的物理位姿作为相机的精确位姿,进入步骤3;若否,则通过质心icp算法估算出的当前帧和前一帧的相对位姿,用前一帧的精确位姿与当前帧和前一帧的相对位姿计算得到当前帧相机的精确位姿,进入步骤3;

步骤3:利用相机的精确位姿将当前帧数据融合到局部tsdf中;

步骤4:判断是否有结束指令,若否,则从局部tsdf中获取步骤3中融合于局部tsdf的点云,以该点云作为前一帧的点云,重复步骤1-4;

若是,将局部tsdf与全局tsdf进行匹配融合,并将局部tsdf初始化;判断是否有程序结束指令,若是,从全局tsdf提取点云,并且使用贪婪三角化获得物体模型;若否,则从全局tsdf中获取在上一帧相机位姿下获取前一帧的点云,重复步骤1-步骤4。

进一步,步骤3中的结束指令含程序结束指令和局部tsdf融合所需帧数到达预定数量是发出的指令。

进一步,步骤2中,估算出的当前帧和前一帧的相对位姿时先通过前一帧点云的质心和当前帧点云的质心获得相机初始平移量,再使用icp算法获取前一帧和当前帧的相对位姿。

进一步,步骤1中,在深度图像中将对象从场景中分割出来的方法是:

步骤1-1-1:压缩当前帧深度图像的深度图数据,压缩后的深度图数据的每一个数值代表一个区域的深度值;

步骤1-1-2:计算压缩后的深度图的深度直方图,取前n个峰值的深度值;判断这n个峰值的深度值是否在物体的深度值范围内,物体的深度值范围人为设定,若否,则放弃当前帧深度图像;若有多个峰值的深度值在物体的深度值范围内、则将前n个峰值的最大值作为输出值,若只有一个峰值的深度值在物体的深度值范围内、则将该峰值的深度值作为输出值,记为dh单位为m;

步骤1-1-3:将dh-0.2设为下阈值,dh+0.2设为上阈值,获得物体深度图do:

表示在像素点(u,v)上的原始深度值。

进一步,步骤1-1中的压缩公式为:其中,为向下取整函数,(u,v)表示像素点坐标,d(u,v)表示在像素点(u,v)上的原始深度值,ds(u,v)表示在像素点(u,v)压缩之后的深度值。

进一步,步骤1中,将分割出来的对象数据去除边界噪声的方法为:采用7x7的窗口在整幅深度图像上进行滑窗,计算深度值与窗口中心的深度值的差值大于200mm的像素个数,像素个数记为count,若count>5时,就认为当前窗口中心是属于边界处或者噪点。

进一步,步骤1中,生成点云的方法为:

步骤1-3-1:有序点云有相机的针孔模型获得,相机的针孔模型为:得到xc=zc(u-u0)/fx,yc=zc(v-v0)/fy,zc=d(u,v),为有序点云在第i帧数据在(u,v)位置上的三维坐标;

步骤1-3-2:对于点云中的每个点用n×n的窗口以点为中心获取与点最相近的k个相邻点,为这k个相邻点计算一个最小二乘意义上的局部平面q,其中为平面q的法向量,d为平面q到坐标原点的距离;

步骤1-3-3:获得平面q上的质心对半正定的协方差矩阵m进行特征值分解,将对应于m最小特征值的特征向量作为点的法向量;其中,为点周围的任意一点,的坐标由步骤1-3-1计算获得。

进一步,步骤2中,质心icp算法为:

步骤2-1:计算当前帧和前一帧之间相机的平移量的初始值:其中,为第k-1帧点云的质心,为第k帧点云的质心,(tx0,ty0,tz0)t为第k帧与第k-1帧相机的相对平移量的初始值;

步骤2-2:第k帧相机的姿态表示为:其中,se3:={r,t|r∈so3,t∈r3},

步骤2-3:使用icp算法估算出第k帧与第k-1帧相机的相对位姿。

进一步,步骤3中,将当前帧数据融合到局部tsdf中的方法为:

步骤3-1:构造表示指定尺寸的三维空间的立方体,并将该立方体细分为体素(即三维体素栅格),每个体素包含tsdf值和权重值为当前体素的坐标值;

每个体素通过tsdf(截断符号距离函数)存储该体素到真实场景表面的截断距离;体素位于真实场景表面之前时,tsdf值为正;体素被真实场景表面遮挡时,tsdf值为负;体素在真实场景表面上的点时,tsdf值为零;

步骤3-2:tsdf值为:其中,其中:表示点在第k-1帧的权重值,为在像素坐标下第k帧深度值,dk使用步骤1获得去除边界噪点后的物体深度图,λ表示深度值为1时、光线方向上点与相机光心之间的距离,π(·)表示将点投影到像素平面的函数,μ表示截断距离;

权重值为:其中:wη表示权重值的最大值,

进一步,步骤4中局部tsdf与全局tsdf进行匹配融合的方法为:

步骤4-1:提取局部tsdf中零表面的点云,记为l;

步骤4-2:最小化点云l中的点到全局tsdf零表面距离的平方来获得局部tsdf与全局tsdf的相对位姿;

其中,n表示的总点数,表示中第i个点,表示将映射到全局tsdf坐标上,表示在全局tsdf的坐标上的tsdf值,voxel_x,voxel_y,voxel_z分别表示一个体素在x,y,z方向上所占据的空间大小,volumeminx,volumeminy,volumeminz分别表示全局tsdf在x,y,z方向上的最小值,ξ=(β,γ,α,tx,ty,tz)t∈r6表示局部tsdf与全局tsdf之间的相对位姿;

步骤4-3:将局部tsdf的每个体素转换为

步骤4-3:使用转移到全局坐标系下,再反映射到全局tsdf空间上得到

步骤4-4:融合公式为:

其中wη表示权重值的最大值,表示在位置上的全局的tsdf值,表示在位置上的全局的权重值,表示在位置上的全局的tsdf值,表示在位置上的全局的权重值。

本发明的技术构思是:再设置一个局部tsdf和一个全局tsdf,实时获取深度相机的深度图像,将每n帧组深度图像经预处理后匹配融合到局部tsdf中,n帧深度图像匹配融合形成的局部tsdf已去除噪点且信息丰富。再将局部tsdf匹配融合到全局tsdf后,将局部tsdf初始化,再将下一组n帧深度图像的融合形成局部tsdf中。在形成局部tsdf时即对每一帧深度图像进行了一次降噪和匹配,在将局部tsdf融合到全局tsdf中时又进行了一次匹配,因此本发明与直接将每帧深度图像融入全局tsdf相比具有更高的精度。

本发明的优点在于:

1.先将物体进行分割后再重建,减少后期将物体与周围环境分离的复杂操作,并且对后期的跟踪相机的位姿也有一定的辅助作用;本文提出一种自适应阈值分割法来提取物体,利用物体在前景部分及深度值的光滑连续性,使用深度直方图选取阈值,分割方法简单、速度快等优势,并且对扫描的方式不苛刻。

2.本文利用前后两帧点云之间的质心位置相近,从而得到相机平移量的初始值,再进行icp匹配算法得到相机的位姿。此方法能够解决扫描速度快时,扫描过程中采集数据平台出现卡顿等问题,使得前后两帧之间的相机平移量较大从而导致icp算法匹配失效。

3.本文在发现frametomodal的匹配方式在帧数较小且相机位姿变化不大的情形下能够得到较为精确的物体模型,使用两个tsdf容器,一个用来存储全局tsdf(即全局tsdf),另一个用来作为局部重建的缓存器(即全局tsdf),本文采用每隔50帧将局部缓存器中的tsdf与全局tsdf进行匹配融合,再将局部缓存器中的tsdf进行初始化。因此能够实现:1.在使用frametomodal的匹配方式在指定数量的帧内能够重建出精确的物体模型;2.在进行tsdf融合的过程中有均值除噪的效果,减少噪声对匹配算法精度的影响;3.此方法利用指定数量帧数据再进行匹配,具有更多的信息,有助于提高匹配的精确度。

附图说明

图1是算法流程图。

图2是步骤1的预处理过程图。

图3是提取tsdf为0的体素的示意图。

具体实施方式

物体三维重建算法总体流程如下:

步骤1.从深度相机中获取深度图,经过预处理中的物体分割、去边界除噪点和生成点云及利用pca计算点云法向量得到去边界除噪点后的物体深度图和物体点云数据及法向量。

步骤2.利用前后两帧点云的质心得到相机平移量的初始值,再利用icp算法估计出相机的精确姿态。

步骤3.利用估计出的相机精确位姿将该帧数据融合到局部tsdf中。

步骤4.判断是否有结束指令,结束指令指的是程序结束指令和局部tsdf融合所需帧数到达预定数量是发出的指令;如果不成立,利用raycasting算法从局部tsdf中预测上一相机位姿下的点云,作为下一次第2步骤的输入;否则将局部tsdf与全局tsdf进行匹配融合,并将局部tsdf初始化,再判断是否有程序结束指令,如果成立,从全局tsdf提取点云,并且使用贪婪三角化获得物体模型,否则利用raycasting算法从全局tsdf中预测上一相机位姿下的点云,作为下一次第2步骤的输入。

步骤1中,对深度图像的预处理过程如下:

1)物体分割

在扫描过程中,物体处于相机视场内的前景部分,所以本文采用阈值分割法来分割出物体。由于在扫描过程中,无法保证让物体离相机的深度值在一定值上,所以若阈值为定值时,容易导致分割不稳定。本文提出一种自适应阈值分割法来提取物体。

首先,将深度图0~8000mm(由于kinect最高只能测8000mm的距离)数据压缩到0~255之间,使用进行数据压缩,式子中为向下取整函数,(u,v)表示像素点坐标,d(u,v)表示在像素点(u,v)上的原始深度值,ds(u,v)表示在像素点(u,v)压缩之后的深度值;接着,计算压缩后的深度图ds的深度直方图,取出前三个峰值的深度值,因为在扫描过程中,知道物体离深度相机的深度值为0.5m~1.5m,所以本文查看前三个峰值的深度值是否在此范围内,如果有多个峰值在此范围内,我们将这几个峰值的最大值作为此步骤的输出值,记为dh单位为m,如果没有峰值在此范围内,我们放弃此深度数据;最后,将dh-0.2设为下阈值,dh+0.2设为上阈值。

式中do为物体深度图。

2)去边界除噪点

由于kinect的扫描精度较低,尤其是在边界处,本文将噪声较大的点进行滤除。采用7x7的窗口在整副图像上进行滑窗,计算深度值与窗口中心的深度值的差值大于200mm的像素个数count,若count>5时,就认为窗口的中心点是属于边界处或者噪点。

3)生成点云并计算法向量

根据相机的针孔模型:

得到xc=zc(u-u0)/fx,yc=zc(v-v0)/fy,zc=d(u,v),式子中为有序点云在第i帧数据在(u,v)位置上的三维坐标。

虽然上一步骤去除了噪点,但是输出的点云还是存在着微小的噪声,若是使用相邻的顶点计算法向量:再进行归一化计算出的法向量对噪声的敏感度高,所以本文使用pca(主成分分析)方法计算法向量。

假设点云的采样平面是处处光滑的,因此,任何点的局部邻域都可以用平面进行很好的拟合;为此,对于点云中的每个点获取与其最相近的k个相邻点,由于本文所提供的点云属于有序点云,所以寻找点的相邻点比较简单,本文选取的窗口为7x7,然后为这些点计算一个最小二乘意义上的局部平面q。此平面可以表述如下:

其中为平面p的法向量,d为平面p到坐标原点的距离。

通过简单的运算可知,得到平面q上的质心同时,法向量需要满足因此问题可以转化为对下述式子中半正定的协方差矩阵m进行特征值分解,对应于m最小特征值的特征向量可被当做v的法向量。

1.跟踪相机的位姿

本文通过刚体变换矩阵来表示第k帧6dof相机姿态:

式中se3:={r,t|r∈so3,t∈r3},此刚体变换矩阵表示第k帧相机坐标系到全局坐标系下的映射关系,例如表示在第k帧相机坐标系下的点,通过转换到全局坐标系下。

要将第k帧深度数据融合到tsdf中,我们必须要知道第k帧深度相机相对于全局坐标系的姿态tg,k。为了减小累积误差对重建模型精度的影响,本文使用frame-to-modal的匹配方式进行跟踪相机位姿,利用raycasting算法从tsdf中获得上一帧相机姿态下的点云与法向量。本文使用icp(最邻近点迭代)算法估计相机姿态,最小化当前帧中的顶点到前一帧中表面的距离误差:

式中表示第k-1帧第i点在全局坐标系下的坐标,表示第k帧第i点在第k帧相机坐标系下的坐标,为匹配点,表示第k-1帧第i点在全局坐标系下的法向量,tg,k-1表示第k-1帧相机姿态,表示第k帧与第k-1帧相机的相对姿态,ξ=(β,γ,α,tx,ty,tz)t∈r6为第k帧与第k-1帧相机的相对旋转矢量和平移量,是需要求解的参数,假设相邻两帧之间转动的角度较小,我们将上述能量函数进行线性化,得到:

在进行icp算法之前先寻找匹配点,即寻找最邻近点。寻找匹配点的方式:由于本文使用的点云都是有序点云,所以寻找最邻近点的方式为将当前帧的点云转换到上一帧坐标系下,并将其投影到图像坐标系下得到相对应的像素坐标,上一帧点云此像素坐标的点就是此点的对应点,计算两点之间的距离及法向量的夹角,若是超过阈值则不认为是匹配点,否则认为是匹配点。

试验发现当扫描速度较快时,icp算法匹配失败。经测试发现当我们扫描速度较快时,相邻两帧之间相机的转动量增幅较小,平移量增幅较大。当两帧之间相机平移量较大时,一开始得到的匹配点对较少,容易掉入局部最优或者直接匹配失效。并且发现相邻两帧之间匹配之后的质心基本在同一个位置上。所以本文利用这一特性,得到平移量的初始值。式中为第k-1帧点云的质心,为第k帧点云的质心,(tx0,ty0,tz0)t为第k帧与第k-1帧相机的相对平移量的初始值。接着再进行上述的icp算法计算出第k帧与第k-1帧相机的相对姿态。

2.更新tsdf

本文通过构造一个立方体来表示特定尺寸的三维空间。而后对该立方体进行细分为小的三维体素栅格(5123),每个体素通过截断符号距离函数(tsdf)来存储其到真实场景表面的相对距离。如果体素位于表面之前,则符号距离函数值为正,若在表面遮挡的一侧,那么函数值为负,而符号函数值的过零点(zero-crossing)即为真实场景表面上的点。通过以上操作,深度数据帧对应的三维点云即可通过符号距离函数计算映射到立方体体素中。每个体素上包含tsdf值和权重值为该体素在全局坐标系下的坐标值。

式中为在像素坐标下第k帧深度值,dk使用第一步骤中去边界除噪点后得到的物体深度图,λ表示深度值为1时,光线方向上点与相机光心之间的距离,π(·)表示将点投影到像素平面函数,μ表示截断距离,本文设置为0.03m。本文设利用下列公式更新tsdf值和权重值

式中wη表示权重值的最大值。

3.局部tsdf与全局tsdf匹配融合

匹配:

首先,提取局部tsdf中零表面的点。在体素(x,y,z)((x,y,z)为该体素在局部坐标系下的坐标)处,检查图中三条红线上是否存在tsdf为0的点,即(x,y,z)与(x+1,y,z),(x,y,z)与(x,y+1,z)和(x,y,z)与(x,y,z+1)之间。首先,检查在体素(x,y,z)上tsdf(x,y,z)=1是否成立,如果成立,说明在这三条边上不可能存在tsdf为0的点;其次,以(x,y,z)与(x+1,y,z)这条边为例,检查tsdf(x,y,z)tsdf(x+1,y,z)≤0是否成立,如果成立,则在这条边上存在着tsdf为0的点;最后利用线性插值的方式将边上tsdf为0的点提取出来:

y′=y

z′=z

式子中(x′,y′,z′)为在(x,y,z)与(x+1,y,z)这条边上的tsdf为0的点,如图3所示。

通过上述方法提取出局部tsdf中零表面的点云,记为l。因为我们知道l中的点都是在局部tsdf零表面上,所以本文通过匹配l与全局tsdf得到局部tsdf与全局tsdf的相对位姿。本文通过最小化l中的点到全局tsdf零表面距离的平方来获得局部tsdf与全局tsdf的相对位姿。

式子中n表示l的总点数,表示将映射到tsdf坐标上,表示在位置上的tsdf值,vosel_x,vosel_y,vosel_z分别表示一个体素在x,y,z方向上所占据的空间大小,volumeminx,volumeminy,volumeminz分别表示tsdf在x,y,z方向上的最小值,ξ=(β,γ,α,tx,ty,tz)t∈r6表示局部tsdf与全局tsdf之间的相对位姿。

本文利用高斯-牛顿法求解上述最优化问题。假设局部tsdf与全局tsdf之间的相对位姿较小,化简得到:

式中表示全局tsdf在x,y,z方向上的梯度,为1×3矩阵;表示的雅克比矩阵,为3×4矩阵;对ξ的雅克比矩阵,为4×6矩阵。通过对能量函数进行求导,得到:

式中表示fg对ξ的雅克比矩阵,为n×6矩阵。

融合:

通过匹配局部tsdf与全局tsdf之后得到两者之间的相对位姿tl,g。将局部tsdf的每个体素转换成lx=xvoxel_x+volumeminx,ly=yvoxel_y+volumeminy,lz=zvoxel_z+volumeminz。再通过将l转换到全局坐标系下,再反映射到tsdf空间上得到最后利用下述公式进行融合:

式中wη表示权重值的最大值,分别表示在位置上的全局的tsdf值和权重值,分别表示在位置上的局部的tsdf值和权重值。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1