central south universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · web...

20
CENTRAL SOUTH UNIVERSITY 图图图图图图图图 facechange 题题题题 题题题题 题题题 ,, 题题题题 0918150118 题题题题 题题 题题题题 2017.11.25

Upload: others

Post on 11-Mar-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

CENTRAL SOUTH UNIVERSITY

图像处理结题报告

题 目 facechange 换脸软件 学生姓名 高博聪,孙雪健,吴边 班级学号 0918150118 指导教师 谢斌 设计时间 2017.11.25

目录第一章 项目流程.............................................................................................................................3

Page 2: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

第二章 功能介绍.............................................................................................................................32.1 人脸检测...........................................................................................................................32.2 五官检测...........................................................................................................................52.3 调整脸部...........................................................................................................................52.4 人脸交换...........................................................................................................................72.5 人脸融合...........................................................................................................................92.6 界面设计...........................................................................................................................92.7 Python 程序打包(pyinstaller).............................................................................10

第三章 项目分工............................................................................................................................11第四章 成果展示...........................................................................................................................12第五章 源代码...............................................................................................................................13

2

Page 3: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

第一章 项目流程

(1)人脸检测(2)五官检测(3)调整面部(4)人脸交换(5)人脸融合(6)界面设计(7)应用程序打包

第二章 功能介绍

本程序分为人脸检测、五官检测、调整面部、人脸交换、人脸融合、界面设计、应用程序打包七个部分

2.1 人脸检测

做人脸检测,需要下载 opencv 的 python 接口,基于 Python-OpenCV 以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些 xml 文件,这些文件保存的就是训练好之后的 haar 特征,关于人脸检测的 haar 分类器,下面介绍 haar 分类器Haar 分类器实际上是 Boosting 算法的一个应用,Haar 分类器用到了 Boosting 算

3

Page 4: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

法中的 AdaBoost 算法,只是把 AdaBoost 算法训练出的强分类器进行了级联,并且在底层的特征提取中采用了高效率的矩形特征和积分图方法,这里涉及到的几个名词接下来会具体讨论。虽说 haar 分类器采用了 Boosting 的算法,但在 OpenCV 中,Haar 分类器与Boosting 没有采用同一套底层数据结构,《Learning OpenCV》中有这样的解释:“Haar 分类器,它建立了 boost 筛选式级联分类器。它与 ML 库中其他部分相比,有不同的格局,因为它是在早期开发的,并完全可用于人脸检测。”假设在人脸检测时我们需要有这么一个子窗口在待检测的图片窗口中不断的移位滑动,子窗口每到一个位置,就会计算出该区域的特征,然后用我们训练好的级联分类器对该特征进行筛选,一旦该特征通过了所有强分类器的筛选,则判定该区域为人脸。那么这个特征如何表示呢?我们称这些东西叫 Haar-Like 特征。

将上面的任意一个矩形放到人脸区域上,然后,将白色区域的像素和减去黑色区域的像素和,得到的值我们暂且称之为人脸特征值,如果你把这个矩形放到一个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,而且越不一样越好,所以这些方块的目的就是把人脸特征量化,以区分人脸和非人脸

之后就是使用 adaboost 算法生成一个强分类器对于人脸和非人脸进行区分,4

Page 5: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

但这个过程是比较缓慢的人脸检测函数 detectFaces(),检测图片中所有出现的人脸,并返回人脸的矩

形坐标(矩形左上、右下顶点坐标)。必须使用灰度图像进行输入,之后使用上 面 提 到 的 xml 文 件 ( haar 特 征 ) , 这 里 选 择haarcascade_frontalface_default.xml,之后加载 xml 文件生成分类器,对于输入图像进行检测,返回值即时图片中人脸左上和右下两个坐标。代码截图:

2.2 五官检测

图为 dilb 库提取出面部标记。定位面部的每一个部分,比如 42~45 为左

5

Page 6: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

眼。用 dlib 实 现 了 论 文 One Millisecond Face Alignment with an

Ensemble of Regression Trees 中 的 算 法 (作者为 Vahid Kazemi 和Josephine Sullivan) 。算法本身非常复杂,但 dlib 接口使用起来非常简单。

特征提取器(predictor)由预训练模型训练得出,由传统的能返回一个矩形列表的人脸检测器(detector)提供,其每个矩形列表在图像中对应一个脸预训练模型为 dilb sourcefoge 库提供。

通过函数将一个图像转化成 numpy 数组,并返回一个 68 *2元素矩阵,输入图像的每个特征点对应每行的一个 x,y坐标。之后的操作都是基于这个numpy 数组的,实现了将图像的变化转为数组的变换。具体操作见下图:

2.3 调整脸部

经过五官检测之后,检测出的人脸图像在进行交换之前还存在一个问题:6

Page 7: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

人的脸有大有小,图片有正有斜:

这样的图像处理起来很麻烦。所以下一步,我们要对脸部进行调整,使五官尽量对齐,方便我们进行交换。

为了面部对齐,我们采用普氏分析来调整面部:现在我们已经有了两个标记矩阵,每行有一组坐标对应一个特定的面部特

征(如第 30 行给出的鼻子的坐标)。我们现在要搞清楚如何旋转、翻译和规模化第一个向量,使它们尽可能适合第二个向量的点。想法是,可以用相同的变换在第一个图像上覆盖第二个图像。把它们更数学化,寻找 T,s 和 R,令下面这个表达式的结果最小:

R 是个 2 x2正交矩阵,s 是标量,T 是二维向量,pi 和 qi 是标记矩阵的行。事实证明, 这 类问题 可 用 “常规普氏分析法 ” (Ordinary Procrustes

Analysis) 解决,具体操作如下图:

7

Page 8: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

1.将输入矩阵转换为浮点数。这是之后步骤的必要条件。2.每一个点集减去它的矩心。一旦为这两个新的点集找到了一个最佳的缩

放和旋转方法,这两个矩心 c1 和 c2 就可以用来找到完整的解决方案。3.同样,每一个点集除以它的标准偏差。这消除了问题的组件缩放偏差。4.使用 Singular Value Decomposition 计算旋转部分。奇异值分解(Singular

Value Decomposition)是线性代数中一种重要的矩阵分解,是矩阵分析中正规矩阵对角化的推广。在信号处理、统计学等领域有重要应用。奇异值分解则是谱分析理论在任意矩阵上的推广

5.利用仿射变换矩阵返回完整转化。仿射变换可以理解为・对坐标进行放缩,旋转,平移后取得新坐标的值。・经过对坐标轴的放缩,旋转,平移后原坐标在在新坐标领域中的值。就上例而言,经过普氏分析后调整效果如下:

8

Page 9: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

2.4 人脸交换

在我们这个软件中,实现面部交换的原理就是将一张图片中你想要的部分,覆盖到另一张照片上,所以第一步我们要明确我们要图片中的哪些部分。

我们用这样一个遮罩来选择图像 2 和图像 1 的哪些部分应该是最终显示的图像,值为 1(白色)的地方为图像 2 应该显示出的区域,值为 0(黑色)的地方为图像 1 应该显示出的区域。值在 0 和 1 之间为图像 1 和图像 2 的混合区域。

get_face_mask()的定义是为一张图像和一个标记矩阵生成一个遮罩,它画出了两个白色的凸多边形:一个是眼睛周围的区域,一个是鼻子和嘴部周围的区域。之后它由 11 个像素向遮罩的边缘外部羽化扩展,可以帮助隐藏任何不连续的区域。

9

Page 10: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

这样一个遮罩同时为这两个图像生成,通过转换,可以使图像 2 的遮罩转化为图像 1 的坐标空间。

之后,通过一个 element-wise最大值,这两个遮罩结合成一个。结合这两个遮罩是为了确保图像 1被掩盖,而显现出图像 2 的特性。

最后应用遮罩:

实现面部交换后效果如下:

10

Page 11: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

2.5 人脸融合

此函数试图改变图像 2 的颜色来匹配图像 1。它通过用 im2除以 im2 的高斯模糊,然后乘以 im1 的高斯模糊。这里的想法是用 RGB缩放校色,但是不是用所有图像的整体常数比例因子,每个像素都有自己的局部比例因子。

用这种方法两图像之间光线的差异只能在某种程度上被修正。例如,如果图像1 是从一边照亮,但图像 2 是均匀照明的,色彩校正后图像 2也会出现未照亮边暗一些的现象。

也就是说,这是一个相当粗糙的办法,而且解决问题的关键是一个适当的高斯内核大小。如果太小,第一个图像的面部特征将显示在第二个图像中。过大,内核之外区域像素被覆盖,并发生变色。这里的内核用了一个 0.6 *的瞳孔距离。

11

Page 12: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

2.6 界面设计

界面截图:

总共三个按钮,两个图片显示区

三个按钮的功能:1.选择电脑里任意路径的图片,2.在左边显示所选择的图片,3.将图片上的人脸进行交换后的图片显示在右边图片显示区域。

2.7 Python 程序打包(pyinstaller)

安装 PyInstaller

对于那些网络比较稳定,能够流畅使用 pip 源地址的用户,直接下面的命令就可以搞定:pip install pyinstaller

通常我们会下载源码包,然后进入包目录,执行下面的命令(需要安装

12

Page 13: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

setuptools):python setup.py install

安装完后,检查安装成功与否:pyinstaller --version

安装成功后,就可以使用下面的命令了:• pyinstaller : 打包可执行文件的主要命令,详细用法下面会介绍。• pyi-archive_viewer : 查看可执行包里面的文件列表。• pyi-bindepend : 查看可执行文件依赖的动态库(.so或.dll 文件)• pyi-... : 等等。使用 PyInstaller

pyinstaller 的语法:pyinstaller [options] script [script ...] | specfile

最简单的用法,在和 myscript.py 同目录下执行命令:pyinstaller mycript.py

然后会看到新增加了两个目录 build 和 dist,dist 下面的文件就是可以发布的可执行文件,对于上面的命令你会发现 dist 目录下面有一堆文件,各种都动态库文件和 myscrip 可执行文件。有时这样感觉比较麻烦,需要打包 dist 下面的所有东西才能发布,万一丢掉一个动态库就无法运行了,好在 pyInstaller支持单文件模式,只需要执行:pyinstaller -F mycript.py

你会发现 dist 下面只有一个可执行文件,这个单文件就可以发布了,可以运行在你正在使用的操作系统类似的系统的下面。当然,pyinstaller还有各种选项,有通用选项,如-d 选项用于 debug,了解pyInstaller执行的过程;还有一些针对不同平台的选项,具体用法可以访问

13

Page 14: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

PyInstaller 官方 WIKI。在执行 pyInstaller命令的时候,会在和脚本相同目录下,生成一个.spec 文件,该文件会告诉 pyinstaller 如何处理你的所有脚本,同时包含了命令选项。一般我们不用去理会这个文件,若需要打包数据文件,或者给打包的二进制增加一些 Python 的运行时选项时...一些高级打包选项时,需要手动编辑.spec 文件。可以使用:pyi-makespec options script [script ...]

创建一个.spec 文件,对于手动编辑的.spec 文件,我们使用下面任意一条命令:pyinstaller specfilepyi-build specfile

PyInstaller 的原理简介PyInstaller 其实就是把 python 解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行者的机器上不用安装 python 和你的脚本依赖的库。在 Linux操作系统下,它主要用的binutil 工具包里面的 ldd 和 objdump命令。PyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括 Python 解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用 App 是自我包含的,不需要安装其他包,或某个版本的Python,就可以直接运行了。需要注意的是,PyInstaller 打包的执行文件,只能在和打包机器系统同样的环境

14

Page 15: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

下。也就是说,不具备可移植性,若需要在不同系统上运行,就必须针对该平台进行打包。

第三章 项目分工

高博聪:负责图片面部检测,面部交换,色彩融合

孙雪健:负责界面设计,图片裁剪及显示

吴边:负责打包成 exe 文件。

第四章 成果展示

注:因为打包训练集很大的原因,exe 程序运行会有些慢

15

Page 16: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

第五章 源代码

import cv2import osimport dlibfrom PIL import Imageimport numpy

SCALE_FACTOR = 1FEATHER_AMOUNT = 11FACE_POINTS = list(range(17, 68))MOUTH_POINTS = list(range(48, 61))

16

Page 17: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

RIGHT_BROW_POINTS = list(range(17, 22))LEFT_BROW_POINTS = list(range(22, 27))RIGHT_EYE_POINTS = list(range(36, 42))LEFT_EYE_POINTS = list(range(42, 48))NOSE_POINTS = list(range(27, 35))JAW_POINTS = list(range(0, 17))ALIGN_POINTS = (LEFT_BROW_POINTS + RIGHT_EYE_POINTS + LEFT_EYE_POINTS +RIGHT_BROW_POINTS + NOSE_POINTS + MOUTH_POINTS)OVERLAY_POINTS = [ LEFT_EYE_POINTS + RIGHT_EYE_POINTS + LEFT_BROW_POINTS + RIGHT_BROW_POINTS,NOSE_POINTS + MOUTH_POINTS,]COLOUR_CORRECT_BLUR_FRAC = 0.6PREDICTOR_PATH = "C:/Users/dog/Desktop/face/shape_predictor_68_face_landmarks.dat"detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor(PREDICTOR_PATH)result = []

#将图像转化为 68*2 的 Numpy 数组def get_landmarks(im): rects = detector(im, 1) if len(rects) > 5: raise TooManyFaces if len(rects) == 0: raise NoFaces return numpy.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()])

class TooManyFaces(Exception): passclass NoFaces(Exception): pass

def annotate_landmarks(im, landmarks): im = im.copy()

for idx, point in enumerate(landmarks): pos = (point[0, 0], point[0, 1])

cv2.putText(im, str(idx), pos,

fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,

fontScale=0.4,

color=(0, 0, 255))

17

Page 18: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

cv2.circle(im, pos, 3, color=(0, 255, 255))

return im

#凸包检测def draw_convex_hull(im, points, color): points = cv2.convexHull(points)

cv2.fillConvexPoly(im, points, color=color)

#形成遮罩def get_face_mask(im, landmarks): im = numpy.zeros(im.shape[:2], dtype=numpy.float64) for group in OVERLAY_POINTS: draw_convex_hull(im,landmarks[group],color=1) im = numpy.array([im, im, im]).transpose((1, 2, 0)) im = (cv2.GaussianBlur(im, (FEATHER_AMOUNT, FEATHER_AMOUNT), 0) > 0) * 1.0 im = cv2.GaussianBlur(im, (FEATHER_AMOUNT, FEATHER_AMOUNT), 0) return im

#常规普氏分析def transformation_from_points(points1, points2): points1 = points1.astype(numpy.float64) points2 = points2.astype(numpy.float64) c1 = numpy.mean(points1, axis=0) c2 = numpy.mean(points2, axis=0) points1 -= c1 points2 -= c2 s1 = numpy.std(points1) s2 = numpy.std(points2) points1 /= s1 points2 /= s2 U, S, Vt = numpy.linalg.svd(points1.T * points2) R = (U * Vt).T return numpy.vstack([numpy.hstack(((s2 / s1) * R,c2.T - (s2 / s1) * R * c1.T)),numpy.matrix([0., 0., 1.])])

#找到面部位置def detectFaces(image_name): img = cv2.imread(image_name) face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') if img.ndim == 3: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else:

18

Page 19: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

gray = img #if语句:如果 img维度为 3,说明不是灰度图,先转化为灰度图 gray,如果不为 3,也就是 2,原图就是灰度图 faces = face_cascade.detectMultiScale(gray, 1.2, 5)#1.3 和 5 是特征的最小、最大检测窗口,它改变检测结果也会改变 for (x,y,width,height) in faces: result.append((x,y,x+width,y+height)) print(result) return result

#读取def read_im_and_landmarks(fname): im = cv2.imread(fname, cv2.IMREAD_COLOR) im = cv2.resize(im, (im.shape[1] * SCALE_FACTOR,im.shape[0] * SCALE_FACTOR)) s = get_landmarks(im) return im, s

#图二映射到图一def warp_im(im, M, dshape): output_im = numpy.zeros(dshape, dtype=im.dtype) cv2.warpAffine(im,M[:2],(dshape[1], dshape[0]),dst=output_im,borderMode=cv2.BORDER_TRANSPARENT,flags=cv2.WARP_INVERSE_MAP) return output_im

#修正颜色def correct_colours(im1, im2, landmarks1): blur_amount = COLOUR_CORRECT_BLUR_FRAC * numpy.linalg.norm( numpy.mean(landmarks1[LEFT_EYE_POINTS], axis=0) - numpy.mean(landmarks1[RIGHT_EYE_POINTS], axis=0)) blur_amount = int(blur_amount) if blur_amount % 2 == 0: blur_amount += 1 im1_blur = cv2.GaussianBlur(im1, (blur_amount, blur_amount), 0) im2_blur = cv2.GaussianBlur(im2, (blur_amount, blur_amount), 0) im2_blur += (128 * (im2_blur <= 1.0)).astype(im2_blur.dtype) return (im2.astype(numpy.float64) * im1_blur.astype(numpy.float64) /im2_blur.astype(numpy.float64))

#裁剪并保存面部def saveFaces(image_name): faces = detectFaces(image_name) if faces: #将人脸保存在 save_dir 目录下。 #Image模块:Image.open获取图像句柄,crop剪切图像(剪切的区域就是 detectFaces返

19

Page 20: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

回的坐标),save 保存。 count = 0 for (x1,y1,x2,y2) in faces: file_name = os.path.join(str(count)+".jpg") Image.open(image_name).crop((x1,y1,x2,y2)).save(file_name) count+=1

saveFaces('b2.jpg')base_img= Image.open('b2.jpg')#第一张脸im1, landmarks1 = read_im_and_landmarks('C:/Users/dog/PycharmProjects/facechange(double++)/1.jpg ')im2, landmarks2 = read_im_and_landmarks('C:/Users/dog/PycharmProjects/facechange(double++)/0.jpg')M = transformation_from_points(landmarks1[ALIGN_POINTS],landmarks2[ALIGN_POINTS])mask = get_face_mask(im2, landmarks2)warped_mask = warp_im(mask, M, im1.shape)combined_mask = numpy.max([get_face_mask(im1, landmarks1), warped_mask],axis=0)warped_im2 = warp_im(im2, M, im1.shape)warped_corrected_im2 = correct_colours(im1, warped_im2, landmarks1)output_im = im1 * (1.0 - combined_mask) + warped_corrected_im2 * combined_maskcv2.imwrite('output0.jpg', output_im)#第二张脸im3, landmarks3 = read_im_and_landmarks('C:/Users/dog/PycharmProjects/facechange(double++)/0.jpg ')im4, landmarks4 = read_im_and_landmarks('C:/Users/dog/PycharmProjects/facechange(double++)/1.jpg')M1 = transformation_from_points(landmarks3[ALIGN_POINTS],landmarks4[ALIGN_POINTS])mask1 = get_face_mask(im4, landmarks4)warped_mask1 = warp_im(mask1, M1, im3.shape)combined_mask1 = numpy.max([get_face_mask(im3, landmarks3), warped_mask1],axis=0)warped_im4 = warp_im(im4, M1, im3.shape)warped_corrected_im4 = correct_colours(im3, warped_im4, landmarks3)output_im1 = im3 * (1.0 - combined_mask1) + warped_corrected_im4 * combined_mask1cv2.imwrite('output1.jpg', output_im1)

tmp_img0 = Image.open('output0.jpg')tmp_img1 = Image.open('output1.jpg')region1 = tmp_img1region0 = tmp_img0base_img.paste(region1,result[0])base_img.paste(region0,result[1])base_img.save('final.jpg')

20

Page 21: Central South Universityairl.csu.edu.cn/.../2017fall/data/7/jieti.docx · Web view做人脸检测,需要下载opencv的python接口,基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存,下载了之后会有一些xml文件,这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,下面介绍haar

21