使用OpenCV(C ++ / Python)进行人脸交换
--
图3.面部对齐。左:检测到面部标志和凸包。中:凸包上的点的Delaunay三角剖分。右:通过仿射扭曲三角形进行面部对齐。
1 人脸对齐
1.1 脸部地标检测
两个脸部的几何形状非常不同,因此我们需要对源脸部进行一些扭曲以使其覆盖目标脸部,但是我们还想确保我们不会使其扭曲而无法识别。
首先使用dlib在两个图像上检测面部标志。但是,与“ 脸部变形”不同,我们不也不应使用所有点进行脸部对齐。
我们只需要如图所示的人脸外边界上的点即可。
1.2 查找凸包
在计算机视觉和数学术语中,点或形状的集合的边界称为“包”。没有任何凹面的边界称为“凸壳”。
在图3中,左图显示了使用dlib检测到的脸部界标为红色,点的凸包显示为蓝色。
一组点的凸包可以使用OpenCV的concealHull函数来计算。
python:
# points is numpy array of points obtained
# using dlib.
hullIndex = cv2.convexHull(points, returnPoints = False)
# hullIndex is a vector of indices of points
# that form the convex hull.
c++:
vector<int> hullIndex;
// points is of type vector<Point2f> obtained
// using dlib.
convexHull(points, hullIndex, false, false);
// hullIndex is a vector of indices of points
// that form the convex hull.
1.3 Delaunay三角剖分
对齐的下一步是对凸包上的点进行Delaunay三角剖分。在图3的中间图像中显示了三角剖分。
这使我们可以将脸部分成较小的部分。我以前的文章详细解释了Delaunay三角剖分,请参见此处
1.4 仿射扭曲三角形
进行面对齐的最后步骤,以考虑源脸部和目标脸部之间的对应三角形,并将源脸部三角形仿射扭曲到目标脸部上。
有关我的脸部变形的更多信息,请参见我的文章。
但是,如您在图3的右图中所看到的,对齐面部并将一个面部拍打在另一面部的上方看起来并不自然。
由于两个图像之间的光照和肤色差异,可以看到接缝。下一步显示如何无缝地组合两个图像。
2 无缝克隆
好的技术思想就像是魔术。优秀的魔术师结合了物理,心理学和良好的旧手技巧来达到令人难以置信的效果。
仅图像扭曲看起来就很糟糕。将其与Seamless Cloning结合使用,结果是神奇的!我写了一篇文章,解释的细节在这里。
这是OpenCV 3中的一项功能,可让您无缝地将源图像的一部分(由掩码标识)克隆到目标图像上。
python:
output = cv2.seamlessClone(src, dst, mask, center, cv2.NORMAL_CLONE)
c++:
seamlessClone(src, dst, mask, center, output, NORMAL_CLONE);
上面用法中的src图像如图3所示。(右图)。的DST图像是其上我们要混合源图像(即特朗普的图像)的图像。
通过使用fillConvexPoly用白色填充凸包来计算蒙版,并且中心是包含蒙版的边界框的中心。
总结:
脸部地标检测(Facial Landmark) 点
查找凸包(Convex Hull ) 面
Delaunay三角剖分(Delaunay Triangulation )
仿射扭曲三角形(源脸部三角形仿射扭曲到目标脸部)(Affine warp triangles )
无缝克隆(Seamless Cloning)
--
使用OpenCV(C ++ / Python)进行人脸交换的更多相关文章
- 使用OpenCV和Python进行人脸识别
介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...
- OpenCV + python 实现人脸检测(基于照片和视频进行检测)
OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...
- 手把手教你如何用 OpenCV + Python 实现人脸识别
下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like 通俗的来讲,就是作为人脸特 ...
- Python使用OpenCV实现简单的人脸检测
文章目录: OpenCV安装 安装numpy 安装opencv OpenCV使用 OpenCV测试 效果图: 注意: 图片人脸检测 程序要求: 技术实现思路 注意 本文使用的环境是:Windows+P ...
- 手把手教你如何用 OpenCV + Python 实现人脸检测
配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like Haar-like百科释义.通俗的来讲 ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- OpenCV Facial Landmark Detection 人脸关键点检测
Opencv-Facial-Landmark-Detection 利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Note: OpenCV3.4 ...
- (原)windows8.1上使用opencv for python
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6204100.html 参考网址: http://www.docs.opencv.org/master/ ...
- 【从零学习openCV】IOS7根据人脸检测
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- Ubuntu16.04安装opencv for python/c++
Ubuntu16.04安装opencv for python/c++ 网上关于opencv的安装已经有了不少资料,但是没有一篇资料能让我一次性安装成功,因此花费了大量时间去解决各种意外,希望这篇能给一 ...
随机推荐
- django学习记录1
在看django的基础知识,还是按照以前一样来总结,还是晚上再统一总结好了,边看边总结好像效果不大. 第一部分是生成数据库,用python manage.migrate命令来生成django的基础架构 ...
- flutter入门开发的一些坑
flutter入门开发的一些坑 很久没写博客了,最近在准备物联网比赛,顺便抽出时间学习了一下flutter,花了近2周完成了一个查看博客博文的一个小的APPdemo,随便截了两张图,如下: 首页 博客 ...
- java操作redis(jedis)常用方法示例
说明:redis命令和jedis方法名基本是一一对应的 Redis常用命令1 连接操作命令 ● quit:关闭连接(connection) ● auth:简单密码认证 ● help cmd: 查看cm ...
- P1311 选择客栈[模拟]
题目描述 丽江河边有nn家很有特色的客栈,客栈按照其位置顺序从 11到nn编号.每家客栈都按照某一种色调进行装饰(总共 kk 种,用整数 00 ~k-1k−1 表示),且每家客栈都设有一家咖啡店,每家 ...
- 《BUG创造队》作业8:软件测试与Alpha冲刺(第五天)
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 BUG创造队 作业学习目标 (1)掌握软件测试基础技术.(2)学习 ...
- vbs查找Excel中的Sheet2工作表是否存在不存在新建
set oExcel = CreateObject( "Excel.Application" ) oExcel.Visible = false '4) 打开已存在的工作簿: oEx ...
- C#随机数Random
一.常用操作 NextDouble():返回0-1.0之间的随机数 Next():返回非负随机数(0-216) Next(i):返回一个小于i的非负随机数 Next(i,j):生成i – j 的随机数 ...
- hbase实践之协处理器Coprocessor
HBase客户端查询存在的问题 Scan 用Get/Scan查询数据, Filter 用Filter查询特定数据 以上情况只适合几千行数据以及不是很多的列的"小数据". 当表扩展为 ...
- js 相差年、月、日
<!-- 相差天数--> function datedifference(startDate, endDate) { var dateSpan, tempDate, iDays; sDat ...
- pandas数据类型(二)与numpy的str和object类型之间的区别
现象: Numpy区分了str和object类型,其中dtype(‘S’)和dtype(‘O’)分别对应于str和object. 然而,pandas缺乏这种区别 str和object类型都对应dtyp ...