换脸技术,用 Python — OpenCV 来实现!

简介: 建议你提前了解一下,因为本文将用到这里面将用到 人脸特征点提取、Delaunay 三角剖分。人脸替换技术是相对较难的,原因之一为人与人之间脸型的区别较大(纹理、脸型、区域凹凸部位等),使得替换后人脸区域与周围的皮肤组织差别较大,产生失真、不自然的视觉效果

1,Face Swap 技术介绍


好了,下面将详细介绍 人脸替换技术并用 OpenCV  来实现;介绍到这里,如果没有看过之前写的几篇文章


实现人脸识别、人脸68个特征点提取,或许这个 Python 库能帮到你!

利用 OpenCV-Python 进行人脸 Delaunay  三角剖分(人脸检测核心技术之一)

建议你提前了解一下,因为本文将用到这里面将用到 人脸特征点提取、Delaunay 三角剖分。


人脸替换技术是相对较难的,原因之一为人与人之间脸型的区别较大(纹理、脸型、区域凹凸部位等),使得替换后人脸区域与周围的皮肤组织差别较大,产生失真、不自然的视觉效果,

就下面两张图给出的最终人脸替换图,之所以结果非常辣眼睛,主要的原因如下几点:

1,年龄差别,脸部皱纹、纹理区域差别较大;

2,种族差别;一个是亚裔黄种人,一个是白种人,眼睛凹陷程度面部构造差别较大;

3,性别差别;男士和女士的脸型还是会有细微的区别的;

微信图片_20220520110919.jpg


2,人脸替换技术需要解决难点


1,脸部区域大小不一致问题,例如一个体型较胖的和体型较瘦的人大小是明显不一样的,直接替换操作明显是不合适的,需要我们提前统一脸型才能有后续的操作;

2,人脸替换后,替换的人脸区域跟周围的皮肤组织会明显存在颜色差别,灯光等问题使得替换缝隙比较突兀,如下图,这个问题如果得不到解决,最终处理后的图像会非常 “假”;

微信图片_20220520110921.jpgcombina.jpg

3,人脸拍摄角度问题,有的图片展示的是正脸、有的展示的是侧脸;

4,最终皮肤问题,需要把替换的的脸部区域纹理与周围组织的保持一致,最终变化差别不大;

由于技术有限,本文利用 OpenCV 只解决了问题 1 和 2,问题 3  和 4 的解决方法有兴趣的同学可以继续深挖一下


3,OpenCV 实现人脸识别;


1,特征点提取、找到 Convexhull

利用 dlib 程序包进行人脸特征点提取,根据特征点 find Convexhull(凸包)人脸区域轮廓勾勒 (这里只需要把脸部轮廓勾勒出来即可,不需要脸部中间的特征点),  人脸特征点提取请参考:

实现人脸识别、人脸68个特征点提取,或许这个 Python 库能帮到你!

微信图片_20220520110923.jpg

2,Delaunay 三角剖分

利用步骤 1 计算得到的 Convexhull(凸包),进行 Delaunay 三角剖分,结果如下图,三角剖分的具体操作请参考:

利用 OpenCV-Python 进行人脸 Delaunay  三角剖分(人脸检测核心技术之一)

微信图片_20220520110925.jpg

3,仿射变换

对 2 中的每个三角区域计算 仿射变换矩阵,并应用到人脸区域,最终实现初步对齐:

微信图片_20220520110927.jpgcombina.jpg

4,Seamless Cloning(无缝克隆)

步骤 3 中得到凸显边缘处缝隙明显,失真程度较大,这里最终借助于 OpenCV 的 Seamless Cloning 函数进行后处理,这里需要一个 人脸 Mask ( 借助于fillConvexPoly 函数),一个比对图,以及要处理的图像

output = cv2.seamlessClone(np.uint8(img1Warped),img2,mask,center,cv2.NORMAL_CLONE)

微信图片_20220520110930.jpg

看起来还不错吧

4,小总结

本文用到的技术比较多,涉及 dlib 特征点提取,Subdiv2D 计算 Delaunay 三角剖分,find Convexhull计算多边形区域凸包,fillConvexpoly 多边形区域填充等技术

本文也算 OpenCV 的一个进阶应用,对于刚了解的小伙伴们来说,完全掌握需要一些时间,还是建议跟着代码敲一遍理解一下 Coding 的基本流程顺序,由于篇幅原因,核心代码放在下面:

def warpTriangle(img1,img2,t1,t2):
    # Find bounding rectangle for each triangle
    r1 = cv2.boundingRect(np.float32([t1]))
    r2 = cv2.boundingRect(np.float32([t2]))
    # Offset points by left top corner of respective rectangles
    t1Rect =[]
    t2Rect = []
    t2RectInt = []
    for i in range(0,3):
        t1Rect.append(((t1[i][0]-r1[0]),(t1[i][1]-r1[1])))
        t2Rect.append(((t2[i][0]-r2[0]),(t2[i][1]-r2[1])))
        t2RectInt.append(((t2[i][0] - r2[0]),(t2[i][1]-r2[1])))
    # Get mask by filling triangle
    mask = np.zeros((r2[3],r2[2],3),dtype = np.float32)
    cv2.fillConvexPoly(mask,np.int32(t2RectInt),(1.0,1.0,1.0),16,0)
    # Apply warpImage to small rectangular patches
    img1Rect = img1[r1[1]:r1[1]+r1[3],r1[0]:r1[0]+r1[2]]
    size = (r2[2],r2[3])
    img2Rect = applyAffineTransform(img1Rect,t1Rect,t2Rect,size)
    img2Rect = img2Rect*mask
    # Copy triangular region of the rectangular patch to the output image
    img2[r2[1]:r2[1]+r2[3],r2[0]:r2[0]+r2[2]] = img2[r2[1]:r2[1]+r2[3],r2[0]:r2[0]+r2[2]] *((1.0,1.0,1.0)-mask)
    img2[r2[1]:r2[1] +r2[3],r2[0]:r2[0]+r2[2]] = img2[r2[1]:r2[1]+r2[3],r2[0]:r2[0]
相关文章
|
20天前
|
机器学习/深度学习 算法 数据挖掘
6种有效的时间序列数据特征工程技术(使用Python)
在本文中,我们将探讨使用日期时间列提取有用信息的各种特征工程技术。
75 0
|
9天前
|
存储 安全 算法
RSA在手,安全我有!Python加密解密技术,让你的数据密码坚不可摧
【9月更文挑战第11天】在数字化时代,信息安全至关重要。传统的加密方法已难以应对日益复杂的网络攻击。RSA加密算法凭借其强大的安全性和广泛的应用场景,成为保护敏感数据的首选。本文介绍RSA的基本原理及在Python中的实现方法,并探讨其优势与挑战。通过使用PyCryptodome库,我们展示了RSA加密解密的完整流程,帮助读者理解如何利用RSA为数据提供安全保障。
27 5
|
11天前
|
数据采集 机器学习/深度学习 搜索推荐
Python爬虫技术基础与应用场景详解
本文介绍了爬虫技术的基本概念、原理及应用场景,包括数据收集、价格监测、竞品分析和搜索引擎优化等。通过一个实战案例展示了如何使用Python爬取电商网站的商品信息。强调了在使用爬虫技术时需遵守法律法规和道德规范,确保数据抓取的合法性和合规性。
|
13天前
|
存储 安全 算法
显微镜下的安全战!Python加密解密技术,透视数字世界的每一个安全细节
【9月更文挑战第7天】在数字世界中,数据安全至关重要。Python加密解密技术如同显微镜下的精密工具,确保信息的私密性和完整性。以大型医疗机构为例,通过AES和RSA算法的结合,既能高效加密大量医疗数据,又能安全传输密钥,防止数据泄露。以下是使用Python的`pycryptodome`库实现AES加密和RSA密钥交换的简化示例。此方案不仅提高了数据安全性,还为数字世界的每个细节提供了坚实保障,引领我们迈向更安全的未来。
21 1
|
20天前
|
测试技术 开发者 Python
Bottle技术:如何用Python打造小巧而强大的Web应用,让你一鸣惊人?
【8月更文挑战第31天】本文介绍了Bottle——一种轻量级Web框架,以其简洁的语法和强大功能受到开发者喜爱。文章涵盖Bottle的核心概念(路由、模板、请求对象),并展示了其简单易用的特性及快速开发能力。通过遵循最佳实践,开发者能够高效地利用Bottle创建高质量Web应用,迎接未来Web开发的挑战。
14 1
|
20天前
|
测试技术 Python
Bottle技术:如何用Python打造小巧而强大的Web开发利器?
【8月更文挑战第31天】Bottle是一个用Python编写的轻量级Web框架,设计简洁、快速且小巧,适用于快速开发Web应用程序。其主要特点包括简单易学、快速开发、小巧轻量及强大的功能,如路由、模板和表单验证等。Bottle的核心概念包括路由、模板和请求对象,可通过示例了解其基本用法。此外,合理使用路由、编写测试和利用Bottle扩展等最佳实践有助于更高效地进行Web开发。随着Bottle生态的不断发展,它将在未来Web开发中扮演更重要的角色。
24 1
|
2天前
|
存储 数据挖掘 测试技术
Python接口自动化中操作Excel文件的技术方法
通过上述方法和库,Python接口自动化中的Excel操作变得既简单又高效,有助于提升自动化测试的整体质量和效率。
11 0
|
12天前
|
应用服务中间件 网络虚拟化 nginx
Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦
以上是对每个问题的简要答案,由于篇幅限制,未能深入到1000字的详细解释,但希望这提供了一个良好的起点。对于这类复杂的话题,深入研究和专业指导至关重要。
19 0
|
20天前
|
运维 Kubernetes 监控
自动化运维:使用Python脚本实现系统监控云原生技术实践:Kubernetes在现代应用部署中的角色
【8月更文挑战第31天】在现代IT运维管理中,自动化已成为提高效率和准确性的关键。本文将通过一个Python脚本示例,展示如何实现对服务器的自动监控,包括CPU使用率、内存占用以及磁盘空间的实时监测。这不仅帮助运维人员快速定位问题,也减轻了日常监控工作的负担。文章以通俗易懂的语言,逐步引导读者理解并实践自动化监控的设置过程。 【8月更文挑战第31天】本文旨在探索云原生技术的核心—Kubernetes,如何革新现代应用的开发与部署。通过浅显易懂的语言和实例,我们将一窥Kubernetes的强大功能及其对DevOps文化的影响。你将学会如何利用Kubernetes进行容器编排,以及它如何帮助你的
|
20天前
|
机器学习/深度学习 人工智能 监控
利用Python和OpenCV实现实时人脸识别系统
【8月更文挑战第31天】本文将引导您了解如何使用Python结合OpenCV库构建一个简易的实时人脸识别系统。通过分步讲解和示例代码,我们将探索如何从摄像头捕获视频流、进行人脸检测以及识别特定个体。本教程旨在为初学者提供一条明晰的学习路径,帮助他们快速入门并实践人脸识别技术。