基于RGB-D图像的3D人脸重建

说明:本文来自于【知网】《基于RGB_D图像的3D人脸重建》_吴兴龙
整体步骤:
获得深度图像和彩色图像(使用kinect设备)–>深度图像预处理–>人脸检测–>人脸区域分割–>人脸区域追踪–>提取3D人脸点云数据—>点云配准以及数据整合–>人脸3D模型生成

整体目的:
目的是利用多帧数据重建完整的3D人脸模型。

每个步骤的详细介绍:
一、预处理
采用双边滤波对图像进行预处理,双边滤波是一种可以保边去噪的滤波器,一般滤波器的作用结果会丢失边缘的信息(这里的边缘主要是指图像中主要的不同颜色区域(天空与草地,头发与人脸) ),然而双边滤波就是在高斯滤波中加入了另外的一个权重分部来解决这一问题。
公式和滤波效果图可参考:【知网】《基于RGB_D图像的3D人脸重建》_吴兴龙_P16和P17

二、人脸区域分割
由于利用kinect可同时获得彩色和深度信息,如果只利用深度信息,则很难分辨物体是否是人脸,如果只利用彩色信息,人脸区域的分割又会比较耗时,因此同时基于RGB图及深度图做人脸分割
1、基于RGB图像的人脸检测
首先要做的就是确定某一帧图像中是否有人脸以及人脸的大概位置。基于RGB图的人脸检测一般分为基于知识的方法、基于特征的方法、基于模板的方法及基于外观的方法。本文使用基于特征的Viola-Jones方法,本方法是一种高效的基于特征的人脸检测方法,由Paul Viola及Michael Jones在2001年提出。Volia-Jones算法基于矩形特征,如图2.2所示。利用积分图,矩形特征可以获得很快的运算速度,这正是violajones算法高效的重要原因。
一张24*24的图片可以提取超过180,000个矩形特征,利用*Adaboost算法,可以挑选出具有较强区分性的特征,并训练出级联分类器。级联分类器如图2.3所示。_参考P18
由于此方法耗时较少,结果准确,已经成为了广泛使用的人脸检测方法之一。OpenCV提供了该算法的实现
2、基于深度图的人脸分割
人脸检测可以得到人脸的矩形区域,仍然会有小部分背景残留。本文利用图像分割技术基于深度图像对人脸区域做进一步分割。
现有的图像分割方法可以分为基于闽值的分割方法,区域生长方法,区域分裂合并方法,基于边缘检测的分割方法,基于聚类分析的分割方法,基于模糊集理论的分割方法和基于小波分析的分割方法等。
由于在深度图上,人脸区域和背景区域的深度值差别较大,因此可以采用基于阈值的分割方法
本文的阈值确定方法就是先找到人脸区域中除无效深度值以外的最大最小值,如假设人脸前面无明显遮挡,则最小值附近的区域即可以认为是人脸。由于kinect得到的是真实深度信息(以mm为单位),因此通过对人脸厚度的估计即可以得到合适的阈值。

三、人脸区域追踪
利用Mean-shift算法进行人脸跟踪,下面详细介绍一下Mean-shift算法。
Mean-shift,即均值漂移,在跟踪、聚类、图像平滑、分割等问题上有着广泛的应用。该算法最初的含义即如其名:偏移的均值向量;但随着理论的发展,Mean-Shift的含义已经有所变化。现在我们说Mean-shift算法,一般是指一个迭代步骤:先算出当前点的偏移均值,对当前点做偏移,然后以偏移后的点为新的起始点,继续移动,直到满足一定的结束条件。
利用Mean-shift做人脸追踪一般可以分为以下两个步骤:
· 做彩色图投影
一RGB颜色空间对光照亮度变化较为敏感,为了减少光照对跟踪效果的影响,可以首先将图像从RGB空间转换到HSV空间。HSV空间分为:色调(H),饱和度(S),亮度(V)},HSV颜色空间是一个六棱锥模型,能很好的将亮度信息分离。HSV模型如图2.4所示。_参见P21
一对HSV空间中的H分量作直方图,直方图的高度即代表每个H分量值出现的概率或像素个数,就是说通过直方图,可以查出H分量中大小为h的值出现的概率或者像素个数,结合已经得到的人脸信息,即能得到颜色概率查找表。
一做反向投影:将图像每个像素的值使用其颜色出现的概率替换,得到颜色概率分布图。颜色概率分布图是一个灰度图像。

. 利用Mean-shift算法进行跟踪
一在颜色概率分布图中选取初始搜索框W。
一计算零阶矩一阶矩及搜索框的质心: x=M1o/Moo; y=Mo1 /Moo
一将搜索框的中心移动到质心,如果移动距离大于设定的阈值,则重复(1)(2)过程,直到搜索框移动距离小于设定阈值或者迭代次数超过某一最大值。

结合深度信息的人脸追踪方法改进
Mean-shift算法对系统资源要求不高,时间复杂度低,在简单背景下能够取得良好的跟踪效果。但当背景较为复杂,或者有许多与目标颜色相似像素干扰的情况下,会导致跟踪失败。
由于我们利用kinect等设备还可以得到深度信息,结合深度信息,本文提出了如下两种改进方法:
1.利用深度信息做反向投影,即可得到深度信息的概率密度分布。再将深度信息的概率密度分布于彩色图的概率密度分布结合,进行人脸跟踪。经实验,这种方法对于人脸的前后移动过于敏感,因此本文中并没有采用该方法。
2.利用深度信息预分割出前景部分,防止复杂背景的影响。如图2._5该方法简单实用,本文中使用了此方法。

四、3D人脸重建
解决人脸区域分割和追踪的问题之后,下一步就是3D人脸的重建。大致可以分为3D点云数据提取、点云配准和数据整合三个步骤。
1、3D点云数据提取
根据深度信息,我们可以获得精确的3D点云数据。OpenNI中提供了计算真实3D坐标的接口:ConvertProjectiveToRealWorld()通过该接口即可将深度图像数据转化为以kinect为参照建立的坐标系下的3D数据。

2、本文的点云配准算法
本文追求的目标之一就是实时处理,因此对运算速度有一定要求。而恰恰由于实时处理的特点,相邻两张图片之间人脸姿势变化不大;另外本文只是重建人脸区域,利用下采样等技术,可以得到规模较小的点云数据。因此本文采用ICP算法进行点云配准

本文点云数据量不大,每帧数据大约有_5000个点,而且相邻两帧点云数据偏移角度不大(由于每帧数据可以实时处理),因此采用Point to Point最近点搜索算法,借助于KD-tree实现最近点搜索
假设点集Q为当前的人脸数据模型,点集P为当前帧的数据,则本文的ICP算法可以概括为以下步骤:
(1) 根据点集P中的点的坐标,利用KD-tree,在点集Q上搜索相应最近点点集P’;
(2)计算两个点集的重心坐标,并将重心移动到坐标原点;
(3)由中心化之后的点集计算正定矩阵N,并计算其最大特征值及其最大特征向量;
(4)由最大特征向量,得到使残差平方和最小的旋转四元数,再将四元数转换为旋转矩阵R;
(5)算出旋转矩阵R后,平移向量t只是两个点集的重心差异,因此可以通过两个点集的重心点和旋转矩阵确定;
(6)由点集P’计算旋转后的点集P1’。通过计算距离平方和值,判断连续两次距离平方和的差是否小于一定阈值;
(7)满足阈值条件或者迭代次数打到最大值后,停止迭代,否则重复以上六步。

3、人脸3D模型生成
虽然本文使用了精确的ICP点云配准算法,但由于kinect精度限制,深度数据本身不准确,因此所求出的平移和旋转矩阵仍会有一定误差。此时如果逐帧做配准,容易造成误差累计,导致最终结果较差。
本文采用的解决方法是:先将当前帧与前面若干帧的数据整合成一个较完整的人脸模型,并将整个模型调整到当前帧的姿势,再与下一帧做点云配准,求出相应的变换矩阵。
将当前帧的数据与以前的人脸数据做整合时,也不是简单的将两帧数据叠加,而是做了一定的点过滤处理,试图建立规模较小的点云模型,防止随着重建过程的进行,数据量急剧增加,ICP配准算法时间消耗也急剧增加。
具体处理方法如下:
. 设当前帧人脸点云数据为N,当前的人脸模型数据(由前面若干帧整合得到)为B;
· 利用N建立KD-tree,遍历N中相邻两个点,计算出最近距离n;
· 对B中每个点,在N中搜索其最近点,并计算该点到最近点的距离m,若m>2n,则将该点加入到人脸数据中,否则则认为该点已经在原数据中存在。
这样做有以下三个优点:
. 更能满足ICP算法的要求(其中一个点云是另外一个的子集)
· 防止ICP算法随着人脸点云数据的增加,消耗时间急剧增加。
· 有效防止误差累积,作用类似于逐帧匹配(Frame to Frame)和某一帧到模型的匹配(Frame to Model)的差别。
图2.6显示了Frame to Frame匹配和Frame to Model匹配的差别,可以发现,Frame to Model匹配方法可以有效防止误差累积,建立更为光滑的模型。

你可能感兴趣的:(3d重建)