欢迎关注本文首发公众号:Python学习实战。公众号主要发布Python相关技术文章,分享Python实用案例、面试问答题、Python基础巩固等内容。
当前基于深度学习的人工智能的换脸技术比较多,但实际上,对于一些相同角度、相似肤色换脸场景其实无须通过深度学习模型即可达到比较好的效果。本文基于OpenCV针对相同脸部角度、相似肤色场景实现完美换脸。最终效果如下所示(下图为动态图,读者可以仔细观察脸部变化过程):

原理如下:
查找脸部关键点 获取关键点凸包,并对凸包点计算
delanauy三角形。 每个对应的delanauy三角形做仿射变换 人脸融合
脸部关键点可以通过dlib库获取:
pip install dlib如果安装失败,可以尝试一下将Python版本降到3.6。
dlib可以检测人脸68个关键点,如下所示:

得到68个关键点后无法直接贴脸,因为每个人的脸型大小不一致。为了适配不同大小的脸型,我们将人脸区域划分为多个delanauy三角形,每个三角形区域单独做仿射变换。
首先获取人脸关键点凸包,即得到处于外围的关键点,直接调用opencv函数cv2.convexHull即可。得到如下所示:

对凸包点计算delanauy三角形,每个三角形区域单独仿射变换。如下所示:

仿射变换实现如下:
def apply_affine_transform(src, src_tri, dst_tri, size):
''' 应用仿射变换
src: 输入图像
src_tri: 输入图像中的三个点
dst_tri: 输入图像三个点对应输出图像中三个点
size: 输出图像大小
return: 返回输入图像按照两个三角形对应点的仿射变换得到的图像
'''
# 得到仿射矩阵
warp_mat = cv2.getAffineTransform(np.float32(src_tri), np.float32(dst_tri))
# Apply the Affine Transform just found to the src image
dst = cv2.warpAffine(src,
warp_mat, (size[0], size[1]),
None,
flags=cv2.INTER_LINEAR,
borderMode=cv2.BORDER_REFLECT_101)
return dst篇幅原因,这里不贴出其他实现代码。需要代码的直接拉到文章最后,免费获取源码。
人脸融合使用泊松融合比较适合:
...
cv2.seamlessClone(dst, to_img, p_mask, center, cv2.NORMAL_CLONE)
...完整代码的直接拉到文章最后,免费获取源码。
Python学习实战dlib获取人脸68个关键点调用源码。换脸 获取完整源码。如果您觉得本文有帮助,辛苦您点个不需花钱的赞,您的举手之劳将对我提供了无限的写作动力! 也欢迎关注我的公众号:Python学习实战, 第一时间获取最新文章。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。