人脸老化之四Dlib库进行人脸融合变形

在《人脸老化之二学习研究相关图像处理知识(Dlib库的使用)》中参考http://www.learnopencv.com/face-morph-using-opencv-cpp-python/进行基于两个人脸的融合变形。


介绍第三步人脸融合变形,使用的两张测试图片如下。

人脸老化之四Dlib库进行人脸融合变形人脸老化之四Dlib库进行人脸融合变形

第三步:图像的融合变形

经过前一篇文章的介绍即第一和第二步后,现在可是进行两张人脸图片的融合变形。融合变形的结果是融合两幅人脸的特征生成一张新的人脸图像。新的人脸的与两证人脸的相似度即融合度通过参数a(范围[0,1])值进行控制。当a为0时,融合图像(为M)为上图左侧图 (为I),为1时为上图右侧图(为J) 。

具体步骤如下:

1.根据如下公式,找到融合图像M中的关键点的坐标。

人脸老化之四Dlib库进行人脸融合变形

2.计算仿射变换。

现在我们获得了图像I、J和M的各自76个关键点,以及142个D-三角。

在图像I和M之间,根据D-三角之间的对应一个三角形三个顶点之间的关系,利用getAffineTransform求出仿射变换矩阵。图像J和M之间的的处理,同样是便利142个D-三角的数据进行相同的处理。

3.D-三角变形处理。

对于图像I和J的各自142个D-三角,利用2计算的仿射变换矩阵来处理图像的各个三角内的所有像素,从而完成对应的区域的变形。

我们利用Opencv中的warpAffine函数进行反射变换。但是,warpAffine函数处理的是整个图像并不是某一个三角形区域。这里有一个小窍门:

变换D-三角的外接box,warpAffine函数处理外接box中的所有像素。同时,利用mask遮着box外的像素,这样就相当于处理单个的某一个D-三角对应的所有像素。对应三角的mask利用fillConvexPoly来获得。warpAffine函数利用外接box处理时,值得注意的是borderMode设置为BORDER_REFLECT_101,这样可以隐藏三角形之间的连接线。

4.利用alpha融合变形图像。

利用以上处理获得的图像I和J的三角形变形图像数据,利用如下公式,融合处理两个图像数据,获得融合图像。

人脸老化之四Dlib库进行人脸融合变形

以上就是脸部图像的融合处理,当然可以设置不同的alpha获得一系列的融合图像。同时,我们也会发现,在脸部区域,融合图像的对齐的效果非常好,但是在脸部以外对齐效果并不是非常理想,主要是由于关键点比较少导致的不理想结果,如果想要得到更好的效果,可以手动添加如果双肩等的关键点。


这是我测试代码(在这里)根据Satya Mallick提供的代码我进行的一些小的调整,alpha设置为0.5(使用opencv的imread读取图像,原程序使用dlib::load_image读取图像,由于dlib支持png和jpg,而且需要进行一定的设置,我的环境设置总是不正确,所以修改了)。

人脸老化之四Dlib库进行人脸融合变形人脸老化之四Dlib库进行人脸融合变形

人脸老化之四Dlib库进行人脸融合变形人脸老化之四Dlib库进行人脸融合变形

人脸老化之四Dlib库进行人脸融合变形