川普撞脸希拉里(基于 OpenCV 的面部特征交换)

话说此次美国大选可谓赚足了眼球,在美国史上,恐怕没有哪一年的总统大选会像今年同样诡谲和热闹。 美国开国领袖们若是看到美国民众只能在希拉里和川普中选择,估计要集体气活过来。
做为一个闲得蛋疼的吃瓜群众,今天就拿这对冤家作例子,看如何利用OpenCV来实现将希拉里的脸安在川普脸上。固然,你还能够触类旁通,把吴彦祖的脸安到本身脸上试试效果......python

项目简介:经过 OpenCV 库来实现人脸面部特征交换,其实就是将第二张人脸的眼睛、鼻子和嘴巴经过程序自动裁剪适配并覆盖到第一张人脸上,而且为了使得修改后的照片看着更加天然,咱们还须要调整皮肤颜色。
本教程由one_magician发布在实验楼,完整教程及在线练习地址:川普撞脸希拉里(基于 OpenCV 的面部特征交换)git

1、教程介绍

1.1 内容简介

经过 OpenCV 库来实现人脸面部特征交换。github

1.2 知识点

  • 人脸特征交换程序设计思路算法

  • OpenCV 库的使用编程

  • dlib 库的使用bash

  • docopt 库的使用机器学习

1.3 效果图(自带护目镜)

这是原图。函数

此处输入图片的描述
此处输入图片的描述

转换以后的结果是这样的。学习

前方高能ui

前方高能

前方高能

前方高能

此处输入图片的描述

2、环境配置

所谓“工欲善其事,必先利其器”,开始编写代码以前咱们须要先把用到的库安装好。

依赖的库有:

  • dlib

  • opencv

  • docopt

2.1 安装 dlib

dlib 是一个基于 C++ 编写的扩展库,包含有许多经常使用的机器学习算法以及图像处理函数。而且还支持大量的数值计算,如矩阵、大整数随机运算等。可是在编译安装 dlib 以前咱们还须要先给系统装上各类依赖环境,步骤以下。

安装 Python 的开发库 python3-devpython3-setuptools

$ sudo apt-get update
$ sudo apt-get install python3-dev python3-setuptools

另外还要安装 Boost Python 开发文件,它为 Python 编程提供了简单易用的 C++ 函数库接口。

$ sudo apt-get install libboost-python-dev

dlib 原本能够直接经过 pip3 指令进行编译安装,可是因为虚拟机的内存资源不足没法完成编译,所以我这里提供一份编译好的 dlib 动态库。能够经过 wget 命令进行下载,并将 dlib.so 复制到 /usr/local/lib/python3.4/dist-packages/ 目录之下,这样就能够全局使用该模块了。

$ wget http://labfile.oss.aliyuncs.com/courses/686/dlib.so
$ sudo cp dlib.so /usr/local/lib/python3.4/dist-packages/

2.2 安装 OpenCV

OpenCV 是一款功能强大的跨平台计算机视觉开源库,能够用于解决人机交互、物体检测、人脸识别等领域的问题。库自己是采用 C++ 编写的,可是同时也对 Python, Java, C# 等语言提供接口支持。

本门课程考虑到 OpenCV 的安装过程相对较繁琐且耗时较长,所以实验环境已经配置好 OpenCV 3.1 的环境。

此处输入图片的描述

2.3 安装 docopt

docopt 是 Python 的一个第三方参数解析库,能够根据使用者提供的文档描述自动生成解析器。所以使用者能够用它来定义交互参数与解析参数。

安装 docopt 库的过程就很是简单了。

$ sudo pip3 install docopt

3、设计思路

咱们先来考虑一下这个程序须要完成的两大个功能。

  1. 支持从命令行获取指定图像路径

  2. 读取指定图像并进行处理保存

事实上,第一点要求经过借助 docopt 库能够很是快速便捷地构建命令行解析器,具体用法在后续将会详细介绍。

而第二点才是咱们真正须要关注的问题。想象一下在现实生活中,给你两张人像照片,如今要求你将他们的脸部特征交换一下(本次实验中的脸部特征主要指眉毛、眼睛、鼻子和嘴巴组合而成的部位),那么最简单的方法就是将第二我的脸部特征部分剪下拼接到第一我的的照片上。因此事实上,咱们的程序实现也是在模仿这一个过程。可是程序并不知道哪些部分是眉毛、眼睛、鼻子或者嘴巴,在电脑看来这些图片仅仅是一连串二进制数,因此咱们还须要利用 dlib 库中的机器学习算法来帮助咱们检测并标记这些特征部位。

因此咱们的处理方法主要分为如下几个步骤。

  1. 借助 dlib 库检测出图像中的脸部特征

  2. 计算将第二张图像脸部特征对齐到一张图像脸部特征的变换矩阵

  3. 综合考虑两张照片的面部特征得到合适的面部特征掩码

  4. 根据第一张图像人脸的肤色修正第二张图像

  5. 经过面部特征掩码拼接这两张图像

  6. 保存图像

好吧,也许步骤看起来有些多,暂时看不懂也不要紧,跟着教程把项目作一遍,你将会对这些概念慢慢熟悉起来。

本项目教程的详细步骤和所有代码,能够在实验楼查看并在线完成:川普撞脸希拉里(基于 OpenCV 的面部特征交换)
项目来源于 https://github.com/matthewearl/faceswap ,该项目基于 MIT 许可证。

系统化的Python学习路径:Python研发工程师
更多经典练手项目:所有项目

相关文章
相关标签/搜索