首页 > 代码库 > 三维人脸识别预处理,3D face recognition preprocess

三维人脸识别预处理,3D face recognition preprocess

本文由兔死机发布在http://blog.csdn.net/smartempire/article/details/31373817,

转载请注明出处,howdeshui#163.com

最近在做三维人脸识别相关的东西,在已获取三维数据的情况下进行人脸的识别切割是第一步,本文将介绍预处理内的几个操作,最终给出切割后的三维人脸数据以及经过变换的灰度图像。

作者之前申请了国内的三维人脸数据库都没申请到,FRGC v2库也没有回复,只申请到了一个非常小众的库,此库重点是研究有遮挡情况下的三维人脸识别,所以不太符合后面要做表情变化研究。

1、填洞插值操作

扫描得到的数据可能会有一些洞,如下图的眼睛眉毛等部分,所以需要采用cubic等方式进行插值,而且脸部会有称为spike的凸起,这个在后面分割出人脸后会进行消除。需要注意的是,原始数据的x,y轴上的坐标并不是等间距的,所以在插值后需要进行重采样,使得x,y轴上为等间距。


原始三维数据

2、图像插值重采样

之所以会有这一步,是因为三维数据经过插值重采样之后与二维图像的像素点已经不是一一对应的关系了,所以为了接下来的人脸区域检测等操作需要类似的重采样。原始图像与插值重采样后的图分别如下:


原始RGB图像重采样图像

你可能会问原始图像是彩色的,重采样后为毛变成灰度的了,没办法,RGB图像有三个分量,插值与采样我实在不知道该怎么在三个分量上进行,如果在每个分量上进行得到的图像简直才不忍赌。

3、鼻尖点检测

这是关键的一步,因为以鼻尖点为中心做80mm的圆球就能将人脸切割出来,所以这一步的准确性很关键。在一些论文里是这么做的,将三维数据做横向的切片称为slice,在鼻尖点处的slice基本如下图,如果以每一点为圆心做圆,如果圆的半径合适(比如30mm),那么圆心与交点会形成一个三角形而且这个三角形的高(altitude)是最大的,通过这样的方式基本可以确定鼻尖点。但是如果只是这么做会发现有些衣服如衣领等会形成误操作。所以可以先在灰度图像上检测人脸区域,在这个区域取slice能够基本消除误测。

鼻尖点检测示意图鼻尖点(图中黑点)

3、提取人脸部分

在第2步得到nose tip 后,以该点做圆球,以80mm(视情况而定)做半径,落在圆球内的三维点即为人脸点。



4、降噪、去spike操作

Spike主要是一些毛刺,可以定义该点到8-neighbor的距离作为判断依据,如果距离超过某个阈值则可以把该点抹成0然后重新采样,或者直接抹成8-neighbor的均值或者中值。降噪主要针对脸部凹凸不平的情况,作者测试了中值和均值滤波器,但是效果并不明显,或许是因为前期已经重采样的原因。下图是得到的人脸,貌似和第三部的结果没有区别。


5、姿态矫正

有些人脸可能会有旋转平移的情况,这一步将对姿态进行矫粗方便后续的ICP等方法的对齐,矫正用到的方法是Hotelling transform,在之前的博文里介绍过了,不再赘述。结果如下图,由于博主本来选择的数据就是姿态不明显的,所以矫正的结果并不明显。


以上就是预处理的几步,没有涉及到复杂的算法实现,只是实现起来比较琐碎,像nose tip的检测要判断圆与slice的交点,要由粗到细的取slice的间隔以节省CPU时间,所以实现起来比较费时。之前上传的人脸识别的demo即使是免费的也还是有人发牢骚,所以本文的MATLAB代码就不再免费公布了,如果有需要可以联系我howdeshui#163.com。