贾佳璐 应忍冬 潘光华 郭维谦 刘佩林
(上海交通大学电子信息与电气工程学院 上海 200240)
1963年,Roberts提出了从二维图像中重建三维信息的算法[1],从二维图像中提取出特征点,然后利用特征点进行多视图匹配,实现三维场景的重建。二维图像重建算法复杂度较高且真实感较低。随着消费级深度相机的出现,三维信息变得触手可及,三维重建领域也实现了高速的发展。ToF相机是一种主动测距的3D相机,能够直接获取物体的深度信息和灰度信息。基于深度信息进行三维重建的算法计算复杂度明显低于基于二维图像的重建算法,同时重建的模型精度也更高,其中最有代表性的是微软研究院在2012年提出的KinectFusion[2],其利用多帧深度图像重建了三维场景。吴剑峰等[3]提出了一种快速的Kinect三维重建技术,并将其与实际的3D打印结合,实现优化。近年来,随着神经网络的飞速发展,其除了在二维图像的识别分割等方面,也已经应用到了三维重建领域,例如斯坦福大学提出的基于RGB-D图像重建点云模型的PointNet网络[4],江航等[5]也提出了对室内场景CAD模型的重建网络。但是,神经网络实现的重建主要用于对遮挡部分、背面部分的预测,目前精确的重建仍然需要依赖多视角图像的精确匹配。KinectFusion最关键的算法步骤是基于ICP匹配结果利用TSDF进行点云融合重建物体表面,并且采用GPU并行计算使整个算法可以实时进行。但是我们发现该算法对于小物体的重建存在较大的偏差,重建精度受影响较大。为了匹配Smart-ToF相机的特性,本文提出了一个新的物体三维重建的流程,并提出了针对深度图的多边滤波算法,对深度图进行预处理,将多边滤波算法与双边滤波和中值滤波等算法对比,明显提高了深度图的精度。同时本文提出了弥补空洞的算法,能够有效处理因为反光等原因造成的空洞,提高了重建的精度。
KinectFusion重建算法主要流程包括数据的预处理、计算点云法向量并进行位姿估计、点云的融合和表面重建。数据的预处理主要包括深度图滤波、深度图转换为三维点云,三维重建部分主要包括求解点云数据法向量,利用带法向量的点云进行相机位姿估计,然后实现点云融合与表面重建。
预处理主要分为两步:第一步是利用双边滤波器对深度图进行去噪;第二步是将深度图像转换为以相机坐标为原点的点云数据。双边滤波结合了图像空间邻近性和像素相似性两部分,相比于高斯滤波、中值滤波等算法,能够在去噪的同时保留图像的边缘细节。深度图的前后景分界明显,所以具有边缘非常锐利的特性,双边滤波可以避免出现边缘被模糊的现象。双边滤波应用于深度图像时,用滤波核内的周围像素深度值的加权平均表示中心像素的深度值,所用的加权平均基于高斯分布,权重系数包含像素的欧式空间距离和像素深度值的距离,差值越大所占权重越小。
(1)
E(q)=(i-k)2+(j-l)2
(2)
F(q)=‖f(i,j)-f(k,l)‖2
(3)
式中:f(i,j)是图像在点(i,j)处的像素值;f(k,l)是图像在模板窗口Ω的中心坐标点(k,l)的像素值;Nσ(t)=exp(-t2σ-2)是高斯函数;σs、σd是不同的高斯函数的标准差;Wp是归一化系数。除了对于深度图像的滤波,很多研究人员提出了对点云进行滤波的算法。廖昌粟等[6]提出了根据密度滤波和点法矢量进行三维点云的滤波,能够在三维点云域实现去噪光滑算法,我们在改进的三维重建算法中也加入了对点云的滤波。
将深度图投影变换成相机空间坐标的3D点云需要利用相机的内参进行。
(4)
式中:(u,v)是深度图的点坐标,d是该点对应的深度值,kx,ky,cx,cy是相机内参,(x,y,z)是(u,v)对应的点云坐标。
位姿估计主要分为两个过程:先计算点云的法向量,然后用带法向量的点云利用ICP算法进行位姿估计。每个空间点云对应的法向量可以利用像素坐标的相邻点进行计算。
Nk(u)=v[(P(u+1,v)-P(u,v))×
(P(u,v+1)-P(u,v))]
(5)
式中:v[x]=x/‖x‖,利用计算法向量的定义求得三点构成的平面的法向量。
基于深度相机的位姿估计主要利用稠密点云进行ICP匹配[7],ICP是迭代最近点匹配方法,可以利用相邻两帧的有向点云数据进行ICP匹配,称为frame-to-frame算法,也可以利用当前帧与匹配后的模型投影回上一帧位姿的点云数据进行ICP匹配,称为frame-to-model算法。当匹配的点云是通过全部点云投射到上一个相机平面的方式获得时,这种方法获得的点云比Kinect原始采集的数据噪声会减少很多,所以frame-to-model算法得到的匹配结果会优于frame-to-frame算法。ICP算法还可以利用K-D树、精简点云等算法进行加速,从而提高效率,例如黄潜等[8]提出的通过精简点云的快速点云匹配算法。
点云融合与表面重建主要通过截断符号距离场(Truncated Signed Distance Field,TSDF)算法实现[9]。TSDF算法对距离表面较近的几层体素存储其到重建表面的最小距离值,对较远的体素用固定数值表示,这样可以减少内存消耗和冗余点。当体素在表面的前面时,TSDF取正值,当体素在表面的后面时,TSDF取负值。新的一帧深度图获取后,更新点云的同时更新并融合TSDF的值。表面重建是指将离散点云连接成连续的可视等值面,移动立方体法将数据场中八个相邻位置的数据分别存放在一个四面体体元的八个顶点处, 然后当其中一个大于给定的常数T而另一个小于T时,这个棱上一定有一个等于T的位置。我们可以计算该体元中十二条棱和等值面的交叉点,构建出三角面,再连接所有的三角面形成等值面,合并所有体素(立方体)的等值面即可重建出连续完整的表面。
图像滤波有很多种算法,双边滤波在深度图的滤波中表现突出,去除噪声的同时可以保持边缘锐利性,但是双边滤波只利用了深度图像素邻域的相关性,然而ToF相机获得深度图的同时还可以获得强度图像。强度图像与深度图的数据具有一定的相关性,Victor等[10]进行实验测试了被测物体的强度图与深度误差之间的相关性,结果如图1所示。
图1 距离的噪声方差与强度图的关系
可以看出,被测量物体的表面越亮,噪声越小,所以我们将ToF相机采集得到的强度图作为滤波的一个参考输入,加入亮度差与亮度本身作为权重系数,改进双边滤波算法。
Nσd(‖f(i,j)-f(k,l)‖2)×
Nσg1(‖g(i,j)-g(k,l)‖2)×
Nσg2((-g(i,j))2)×Dm(q)]
(6)
式中:g(i,j)为强度图像在(i,j)处的强度值;σg1和σg2分别为强度差和强度的高斯函数的标准差。
受到物体材质、拍摄角度等影响,我们获得的深度图会包含空洞,可以利用周围像素值预测空洞处的深度值。ToF相机获得的深度图的空洞值一般用0或者一个测距范围外的固定值表示,我们需要先判断出空洞位置,然后以需要填补的空洞为中心向八个方向依次搜索,如图2所示。
图2 补深度图的空洞值搜索方向
按照0-7的顺序搜索,直到当前方向搜到有效值后搜索下一个方向,每个方向都获得有效值之后计算加权平均值作为空洞像素的深度值,权重系数为有效值距离空洞的欧式距离。计算空洞的深度值Dh(u)公式如下:
(7)
在重建过程中,将物体摆在一个展台上,首先利用深度信息的的梯度变化进行前后景分割,将物体与背景分离。将物体分割之后,无效点云数量将减少,点云匹配效率得到提高,同时没有背景干扰,可以更高质量的重建目标物体。
为了更好地重建物体完整表面,本文提出了一个新的三维重建算法的流程,主要包含五个步骤:
1) 读入深度图之后,利用多边滤波算法结合灰度图对图像进行去噪,提升图像质量,同时搜索周围有效像素值,并加入距离权重补全空洞值;
2) 将深度图转换为点云,同时对点云进行滤波,去除前后景边缘产生的飞散点;
3) 利用frame-to-model的方法进行点云的匹配,先提取关键点进行粗匹配,然后再进行精匹配,求解相机位姿,最后利用图优化进行后端优化;
4) 去除冗余点云,然后求解点云的法向量;
5) 利用泊松重建算法将带有法向量的点云模型重建得到表面。
由深度图得到点云可以利用式(4)计算,经过深度图滤波的点云数据与原始点云数据相比,表面得到了很好的平滑,但是还有一类噪声,在前后景的边缘处仍会有一条过渡带,还有一些离群点,我们统一称这类噪声为飞散点。在点云匹配前需要滤除飞散点从而为相机位姿与表面重建提供优化后的数据。
本文利用统计滤波去除飞散点。统计滤波的原理是对每个点Pc计算到它的临近点们Pi的平均距离,得到一个高斯分布的结果,均值M和方差s2决定了高斯分布的形状,平均距离在标准范围之外的点判定为飞散点并在点云中删除。
(8)
式中:Ωc是点Pc的邻域区域。P0的空间坐标为(0,0,0),即把距离大于阈值的点统一置为0,然后滤除。
利用点云的配准结果估计相机位姿,包含三个步骤:先粗匹配,再精匹配,最后利用图优化进行全局优化。
粗匹配首先提取图像的关键点,本文通过高斯差分算子提取深度图像的角点作为匹配关键点,对深度图在相同核大小和不同标准差下做高斯滤波,得到图像Iσ1、Iσ2和Iσ3。然后计算相邻两个图像的差分,得到DoG1、DoG2和DoG3三个差分图像,遍历DoG2,判断DoG2(i,j)是否为三个差分图像中m×m邻域的极值点,如果是极值点则选择为角点Pk(u)。
Iσi=Dk(u)*Nσi(u)
(9)
DoGi=Iσi-Iσi-1
(10)
式中:Nσi(u)是标准差分别为σi高斯函数。利用选取的角点进行ICP匹配,实现粗匹配过程。ICP求解相机位姿的原理为:通过最小二乘求解,得到使误差平方和最小的旋转矩阵R0和平移矩阵t0。
(11)
精匹配利用所有有效点云求解R、t,利用R0、t0作为初始值,可以减少迭代次数从而降低计算量。ICP算法结合图优化可以全局优化相机位姿,得到最终轨迹。
(12)
式中:s、j、k是点集的编号。得到的初始估计作为图模型的输入,然后利用Marquard的方法来解算图模型[11]。
我们重建表面前先计算点云的法向量N(u),然后通过泊松重建算法实现表面的重建,泊松重建实质也是一种隐函数的重构方式,融合了全局与局部的优点。首先利用点云的法向量判断表面的内外,表面内用1表示,表面外用0表示,定义指示函数χM(x)估计物体表面为:
(13)
式中:M表示表面内部区域。利用向量空间V和指示函数χM(x)相等求解泊松表面:
▽χ=V
(14)
深度图滤波与补空洞算法利用斯坦福大学开发的仿真数据集SUNCG[12]进行测试,随机从仿真环境中采集500幅无噪声的深度图以及加入了Kinect仿真噪声的深度图。利用PSNR和SSIM评估滤波结果,PSNR可以评估去除噪声的效果,SSIM可以评估结构相似性。由于深度图具有边缘锐利的特性,所以滤波后边缘保持的良好程度是重要指标,因此我们提出了计算PSNR时增加边缘权重的评估方法:
(15)
SSIM=l(x,y)α·c(x,y)β·s(x,y)γ
(16)
式中:peak为该图像的峰值即最远有效距离;Ni和Nj分别是图像的像素宽度和高度;mij是(i,j)像素值在整幅图的权重,所有权重加和结果为Ni×Nj;x是待评估的深度图;y是无噪声的深度图作为真值;l、c、s分别衡量了亮度、对比度和结构相似度。
(17)
(18)
(19)
式中:μx、μy为x和y的均值;σx、σy为标准差;σxy为协方差;c1、c2、c3都是为了避免除零的常数值。
从SUNCG数据集当中采集得到500幅深度图,经过各种滤波后的图片利用PSNRv与SSIM评估,并计算500幅深度图数据的平均值,结果如表1所示。计算过程中无效像素值不进行计算。
表1 滤波结果对比
选取出一组深度图及各种算法滤波结果进行可视化对比,结果如图3所示。中值滤波虽然在PSNRv方面低于双边滤波,但是具有填补小空洞的能力,多边滤波与补空洞算法能够得到更接近真值的结果。
图3 SUNCG深度图滤波结果与补空洞结果
利用ToF实际采集了实验室各个场景的深度图,对滤波与补空洞算法进行了实际测试,其中办公桌场景测试结果如图4所示,左上角电脑屏幕因为反光造成的空洞被准确填补,同时平面也被很好的平滑。
(a) 原始采集图 (b) 滤波与补空洞之后的图图4 Smart-ToF 采集的深度图滤波与补空洞结果
对多个物体进行了重建,随机选取一个物体的三维重建的模型结果,如图5所示,KinectFusion重建结果部分表面出现明显缺口,本文方法可以完整重建物体的表面,并且能够很好地将物体与背景分离。
(a) KinectFusion的重建结果 (b) 本文算法的重建结果图5 重建结果对比
本文提出了结合强度图的深度图像多边滤波算法以及补空洞算法,并提出了针对物体的三维重建改进算法。从峰值信噪比与结构相似性等方面对滤波算法进行评估,结果表明本文算法各方面均优于双边滤波等算法,但是补空洞对于边缘处缺失的深度值的填补仍会出现部分模糊问题,后续研究将继续改善。本文提出的重建算法能够完整、精确地重建出物体的表面,比KinectFusion更加适合于单个物体的三维重建,可以应用于文物扫描保存、商品展示等多个领域。