换脸技术,用 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]
相关文章
|
1月前
|
API Python
【02】优雅草央央逆向技术篇之逆向接口协议篇-以小红书为例-python逆向小红书将用户名转换获得为uid-优雅草央千澈
【02】优雅草央央逆向技术篇之逆向接口协议篇-以小红书为例-python逆向小红书将用户名转换获得为uid-优雅草央千澈
94 1
|
2天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
21 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
23 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
21天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
26天前
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
60 10
|
1月前
|
安全 数据挖掘 编译器
【01】优雅草央央逆向技术篇之逆向接口协议篇-如何用python逆向接口协议?python逆向接口协议的原理和步骤-优雅草央千澈
【01】优雅草央央逆向技术篇之逆向接口协议篇-如何用python逆向接口协议?python逆向接口协议的原理和步骤-优雅草央千澈
66 6
|
2月前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
2月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
109 2
|
3月前
|
数据可视化 数据处理 Python
Python编程中的数据可视化技术
在Python编程中,数据可视化是一项强大的工具,它能够将复杂的数据集转化为易于理解的图形。本文将介绍如何使用matplotlib和pandas这两个流行的Python库来实现数据可视化,并展示一些实用的代码示例。通过这些示例,读者将学会如何创建各种图表,包括折线图、柱状图和散点图等,以便更好地理解和呈现数据。
|
3月前
|
数据采集 API 定位技术
Python技术进阶:动态代理IP的跨境电商解决方案
Python技术进阶:动态代理IP的跨境电商解决方案

热门文章

最新文章