换脸技术,用 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]
相关文章
|
22天前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
144 66
|
22天前
|
SQL 数据采集 数据可视化
深入 Python 数据分析:高级技术与实战应用
本文系统地介绍了Python在高级数据分析中的应用,涵盖数据读取、预处理、探索及可视化等关键环节,并详细展示了聚类分析、PCA、时间序列分析等高级技术。通过实际案例,帮助读者掌握解决复杂问题的方法,提升数据分析技能。使用pandas、matplotlib、seaborn及sklearn等库,提供了丰富的代码示例,便于实践操作。
144 64
|
5天前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
29天前
|
算法 数据挖掘 Python
Python中的拟合技术:揭示数据背后的模式
Python中的拟合技术:揭示数据背后的模式
28 0
Python中的拟合技术:揭示数据背后的模式
|
9天前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
46 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
17天前
|
存储 数据可视化 Python
Python编程中的数据可视化技术
在数据驱动的世界中,将复杂的数据集转换为易于理解的视觉表示形式至关重要。本文将深入探讨如何使用Python进行数据可视化,包括选择合适的库、处理数据和设计有效的图表。我们将一起学习如何让数据讲故事,并确保你的信息传达清晰且有影响力。
|
18天前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
44 2
|
9天前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
31 0
|
13天前
|
数据挖掘 计算机视觉 Python
基于Python的简单图像处理技术
【10月更文挑战第4天】在数字时代,图像处理已成为不可或缺的技能。本文通过Python语言,介绍了图像处理的基本方法,包括图像读取、显示、编辑和保存。我们将一起探索如何使用PIL库进行图像操作,并通过实际代码示例加深理解。无论你是编程新手还是图像处理爱好者,这篇文章都将为你打开一扇新窗,让你看到编程与创意结合的无限可能。
|
16天前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
45 0