本文将介绍如何使用OpenCV和Dlib实现人脸变形(人脸->人脸和人脸->动物脸)。(公众号:OpenCV与AI深度学习)
我们常常在影视作品中看到一些类似的特效,比如一张人脸慢慢变成另一张人脸或者动物的脸,其中颇具代表性的就是《西游记》了,本文将使用OpenCV和Dlib来实现类似功能,效果如下:
OpenCV与AI深度学习
,赞19
【1】人脸->人脸变化效果
【2】人脸->动物脸变化效果
【1】人脸面部特征点检测和动物脸面部特征点获取。人脸面部特征点基于Dlib检测获取,动物脸面部特征点手动标记得到(大家也可以自己训练网络获得)
【2】Delaunay三角剖分。
【3】扭曲图像和 alpha 混合。
我们现在可以智能地融合这两个图像。如前所述,混合量将由一个参数控制α. 使用以下步骤创建变形。
在变形图像中查找特征点的位置:在变形图像中M,我们可以找到所有 80 个点的位置(Xm,Ym)使用等式(1)。
计算仿射变换:所以我们在图像 1 中有一组 80 个点,在图像 2 中有另一组 80 个点,在变形图像中有第三组 80 个点。我们也知道在这些点上定义的三角剖分。选取图像 1 中的一个三角形和变形图像中的相应三角形,并计算将图像 1 中三角形的三个角映射到变形图像中相应三角形的三个角的仿射变换。在 OpenCV 中,这可以使用getAffineTransform来完成。计算每对 149 个三角形的仿射变换。最后,重复图像2和变形图像的过程。
变形三角形:对于图像 1 中的每个三角形,使用上一步计算的仿射变换将三角形内的所有像素转换为变形图像。对图像 1 中的所有三角形重复此操作,以获得图像 1 的变形版本。类似地,获得图像 2 的变形版本。在 OpenCV 中,这是通过使用函数warpAffine来实现的。然而,warpAffine 接收图像而不是三角形。诀窍是计算三角形的边界框,使用 warpAffine 扭曲边界框内的所有像素,然后屏蔽三角形外的像素。三角形蒙版是使用fillConvexPoly创建的。确保在使用 warpAffine 时使用 blendMode BORDER_REFLECT_101。它比克林顿国务卿隐藏她的电子邮件更好地隐藏接缝。
Alpha 混合扭曲图像:在上一步中,我们获得了图像 1 和图像 2 的扭曲版本。这两个图像可以使用等式 ( 2 ) 进行 Alpha 混合,这是最终的变形图像。在我提供的代码中,扭曲三角形和 alpha 混合它们被合并在一个步骤中。
【4】面部变形结果。
视频动态效果:
参考链接与源码下载:
https://learnopencv.com/face-morph-using-opencv-cpp-python/#id1540306373
https://github.com/emreslyn/facial_landmark_and_image_morphing