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

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

一、教程介绍

1.1 内容简介

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

1.2 知识点

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

  • OpenCV 库的使用

  • dlib 库的使用

  • docopt 库的使用

1.3 效果图(自带护目镜)

这是原图。

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

转换之后的结果是这样的。

前方高能

前方高能

前方高能

前方高能

此处输入图片的描述

二、环境配置

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

依赖的库有:

  • 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

三、设计思路

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

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

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

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

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

所以我们的处理方法主要分为以下几个步骤。

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

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

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

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

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

  6. 保存图像

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

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

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


xiaoxiaozi
736 声望236 粉丝

Learn by doing @ shiyanlou.com