使用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的安装已经有了不少资料,但是没有一篇资料能让我一次性安装成功,因此花费了大量时间去解决各种意外,希望这篇能给一 ...
随机推荐
- 基于k8s集群部署prometheus监控ingress nginx
目录 基于k8s集群部署prometheus监控ingress nginx 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署pro ...
- Linux 永久改变系统时间
Centos系统,必须同时修改系统时间和硬件时间,才可以保证修改有效,单纯的使用date命令修改系统时间,是立即生效,重启后系统还原.具体操作如下: 1.date {查看目前本地的时间}2.hwclo ...
- 使用CIFAR-10样本数据集测试卷积神经网络(ConvolutionalNeuralNetwork,CNN)
第一次将例程跑起来了,有些兴趣. 参考的是如下URL: http://www.yidianzixun.com/article/0KNz7OX1 本来是比较Keras和Tensorflow的,我现在的水 ...
- 《CoderXiaoban》第八次团队作业:Alpha冲刺 2
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 Coderxiaoban团队 作业学习目标 (1)掌握软件测试基 ...
- LINQ查询表达式(2) - 在 C# 中编写 LINQ 查询
在 C# 中编写 LINQ 查询 C# 中编写 LINQ 查询的三种方式: 使用查询语法. 使用方法语法. 组合使用查询语法和方法语法. // 查询语法 IEnumerable<int> ...
- 阿里云部署java web
转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在阿里云上部署Javaweb项目. ...
- 完成一个springboot项目的完整总结-------二
我们接着上篇继续写,继续进行springboot项目 一. swagger2 接口描述,测试每个接口是否有效 1. 添加依赖 pom.xml 在编辑pom.xml之前,要先关闭spring-boot项 ...
- c#嵌套CMD窗口
解决方法一: 自己放一个文本框,改成黑色,然后输入命令,执行时,你Process.Start cmd ,此时CMD窗口不显示,然后,将CMD的返回值,再取出来,设回文本框. 如何用这种方法实时获取cm ...
- js模拟滚动条滚动
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Maximal Square II
Description Given a 2D binary matrix filled with 0's and 1's, find the largest square which diagonal ...