这是一个利用dlib进行关键点定位 + opencv处理的人脸对齐、换脸、关键点识别的小demo。原文来自于《Switching Eds: Face swapping with Python, dlib, and OpenCV》
该博文的github地址中有所有的code。这边我将我抽取的code放在自己的github之中,可以来这下载:
https://github.com/mattzheng/Face_Swapping

有人将其进行中文翻译也有将其进行一定改编有以下两个案例:

  • 1.《川普撞脸希拉里(基于 OpenCV 的面部特征交换)-2》
  • 变脸

变脸贴图:

从这几张:


组合变成这几张:



因为原文里面内容丰富,我觉得可以提取出很多有用的小模块,于是乎:
.

提取一:关键点定位与画图

import cv2
import dlib
import numpy
import sys
import matplotlib.pyplot as plt
SCALE_FACTOR = 1 # 图像的放缩比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, sdef 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))cv2.circle(im, pos, 3, color=(0, 255, 255))return im

然后实践就是载入原图:

im1, landmarks1 = read_im_and_landmarks('02.jpg')  # 底图
im1 = annotate_landmarks(im1, landmarks1)%matplotlib inline
plt.subplot(111)
plt.imshow(im1)

.

提取二:人脸对齐

需要一张模板图来作为靠拢的对象图。

# 人脸对齐函数
def face_Align(Base_path,cover_path):im1, landmarks1 = read_im_and_landmarks(Base_path)  # 底图im2, landmarks2 = read_im_and_landmarks(cover_path)  # 贴上来的图if len(landmarks1) == 0 & len(landmarks2) == 0 :raise ImproperNumber("Faces detected is no face!")if len(landmarks1) > 1 & len(landmarks2) > 1 :raise ImproperNumber("Faces detected is more than 1!")M = transformation_from_points(landmarks1[ALIGN_POINTS],landmarks2[ALIGN_POINTS])warped_im2 = warp_im(im2, M, im1.shape)return warped_im2

这里的步骤是:

  • 提取模板图、对齐图的landmarks;
  • 通过transformation_from_points计算对齐图向模板图的转移矩阵M,变换矩阵是根据以下公式计算出来的;
  • warp_im,将 im2 的掩码进行变化,使之与 im1 相符

实践的话就是:

FEATHER_AMOUNT = 19  # 匹配的时候,特征数量,现在是以11个点为基准点  11  15  17 Base_path = '01.jpg'
cover_path = '02.jpg'
warped_mask = face_Align(Base_path,cover_path)

.

提取三:换脸

主要函数:

def Switch_face(Base_path,cover_path):im1, landmarks1 = read_im_and_landmarks(Base_path)  # 底图im2, landmarks2 = read_im_and_landmarks(cover_path)  # 贴上来的图if len(landmarks1) == 0 & len(landmarks2) == 0 :raise ImproperNumber("Faces detected is no face!")if len(landmarks1) > 1 & len(landmarks2) > 1 :raise ImproperNumber("Faces detected is more than 1!")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_maskreturn output_im

主要步骤:

  • 提取模板图、对齐图的landmarks;
  • M,通过transformation_from_points计算对齐图向模板图的转移矩阵M;
matrix([[   0.62876962,    0.20978991, -101.32973923],[  -0.20978991,    0.62876962,   79.11235991],[   0.        ,    0.        ,    1.        ]])
  • mask,得到基于对齐图的掩膜,get_face_mask函数,获取 im2 的面部掩码,mask长成这样:
  • warped_mask ,warp_im函数,将 im2 的掩码进行变化,使之与 im1 相符,跟上面的mask张一样(一个鼻子)
  • combined_mask ,将二者的掩码进行连通(跟warped_mask 长一样)
  • warped_im2 ,warp_im函数,第二次,将第二幅图像调整到与第一幅图像相符(对齐图片,斜了点)
  • warped_corrected_im2 ,correct_colours函数,将 im2 的皮肤颜色进行修正,使其和 im1 的颜色尽量协调(类似下图)
  • output_im 组合图像,获得结果

实践:

FEATHER_AMOUNT = 23Base_path = '03.jpg'
cover_path = '02.jpg'
output_im = Switch_face(Base_path,cover_path)

公众号“素质云笔记”定期更新博客内容:

python︱利用dlib和opencv实现简单换脸、人脸对齐、关键点定位与画图相关推荐

  1. python利用pyqt5和opencv打开电脑摄像头并进行拍照

    python利用pyqt5和opencv打开电脑摄像头并进行拍照 效果如下: 代码如下: #!/usr/bin/python # -*- coding: UTF-8 -*- import sys im ...

  2. AI换脸-简单换脸、人脸对齐、关键点定位与画图

    ```bash简单换脸.人脸对齐.关键点定位与画图有人将其进行中文翻译也有将其进行一定改编有以下两个案例:1.<川普撞脸希拉里(基于 OpenCV 的面部特征交换)-2>变脸变脸贴图:从这 ...

  3. Python+dlib+opencv实现简单的人脸识别

    目录 一.建立人脸数据集 1.采集人脸 2.采集对应20张图片的68个特征点数组和平均特征数组 二.人脸识别 三.总结 参考资料 接上一篇博客基于dlib+opencv3.4+python3.7的人脸 ...

  4. python人像_python 使用OpenCV进行简单的人像分割与合成

    实现思路 通过背景建模的方法,对源图像中的动态人物前景进行分割,再将目标图像作为背景,进行合成操作,获得一个可用的合成影像. 实现步骤如下. 使用BackgroundSubtractorMOG2进行背 ...

  5. 使用Python,dlib,OpenCV在实时的视频流中进行面部标志检测

    上一个博客里写了 面部标志是什么,如何利用dlib进行图片中的面部标志检测: 这篇博客扩展了面部标志的检测,并将其应用于实时检测任务.如何在实时的视频流中进行人脸标志检测. 实时视频流面部标志检测 1 ...

  6. python调用摄像头人脸识别代码_利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别...

    用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考: 使用opencv 调用摄像头 import face_recognition import cv2 ...

  7. 利用python、Pytorch、opencv、pyqt5实现人脸实时签到系统

    前言 一个基于MTCNN人脸检测和FaceNet进行人脸识别签到系统,作者某二本大学里的末流学生,写于2019/09/,python学习期间. 今年7月份开始接触python的,最近闲着无事就开始做了 ...

  8. python+opencv最简单的人脸识别入门

    0前置操作 安装python(最新3.10即可) 安装pycharm(社区版即可) 安装opencv-python(cmd输入pip install opencv-python即可,嫌慢用国内镜像也可 ...

  9. python手势识别_Python|使用opencv进行简单的手势检测

    简单的手势识别,基本思路是基于皮肤检测,皮肤的颜色在HSV颜色空间下与周围环境的区分度更高,从RGB转换到HSV颜色空间下针对皮肤颜色进行二值化,得到mask: defHSVBin(img): hsv ...

最新文章

  1. SAP SD 以PDF格式显示BILLING的输出格式
  2. twitter storm学习 - 安装部署问题汇总
  3. php 调用系统命令 执行外部程序
  4. 图解 Redis 五种数据结构底层实现
  5. 关于meta便签详解
  6. python标准库os的方法listdir_使用python标准库快速修改文件名字
  7. Spring boot配置文件两种方式
  8. 基于KNN实现图像分类——理解图像分类
  9. 合作 | IEIC·IT耳朵智能创新大会:人工智能落地将带来新风口
  10. (二)Linux 权限
  11. libpython3.7m so静态库_libpython3.7m.dll
  12. 2018年9月份计算机二级java无忧模拟软件破解版
  13. opencv与darknet在python2.7下报错问题
  14. python查询12306余票_Python之12306余票查询
  15. 谷歌浏览器chrome扩展插件-农名的世界脚本
  16. C#,ASP.NAT基于腾讯服务器实现自动发送邮件功能的几种方法及遇到的坑
  17. Adobe BrowserLab开放注册并发布升级
  18. 伊利诺理工大学计算机专业,美国伊利诺伊理工大学世界排名_专业_申请条件-PSONE品思...
  19. 代编股票选股公式、代编公式选股、代编期货量化交易公式、代编公式选股
  20. 女人最难挡男人的3种诱惑

热门文章

  1. ThinkPHP---案例1登录登出和添加部门
  2. Highsoft.Highcharts 5.0.6439.38401 key
  3. .JQuery中的Ajax
  4. Linux内核分析:recv、recvfrom、recvmsg函数实现
  5. java 格式化字符串
  6. MongoDB如何释放空闲空间?
  7. (二)Python 装饰器
  8. Oracle的重做日志
  9. SQL Server Update:使用 TOP 限制更新的数据
  10. 【emWin】例程五:显示数值