好久不见,我的朋友们,今天给大家分享的是,利用Python中cv2、dlib以及numpy等几个库,实现摄像头实时换脸的功能,先来介绍下他们吧~

1. CV2指的是OpenCV2,OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和MacOS操作系统上。

2. dlib是一个机器学习的开源库,包含了机器学习的很多算法,使用起来很方便,直接包含头文件即可,并且不依赖于其他库(自带图像编解码库源码)。

3. NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy内部解除了CPython的GIL(全局解释器锁),运行效率极好,是大量机器学习框架的基础库。

4. 导入相对应的库

import cv2
import dlib
import numpy as np

5. 剩下的代码就不一一解释了,该注释的已经注释了,话不多说,直接上代码

detector = dlib.get_frontal_face_detector()  # dlib的正向人脸检测器
predictor = dlib.shape_predictor(r'shape_predictor_68_face_landmarks.dat')  # dlib的人脸形状检测器def get_image_size(image):"""获取图片大小(高度,宽度):param image: image:return: (高度,宽度)"""image_size = (image.shape[0], image.shape[1])return image_sizedef get_face_landmarks(image, face_detector, shape_predictor):"""获取人脸标志,68个特征点:param image: image:param face_detector: dlib.get_frontal_face_detector:param shape_predictor: dlib.shape_predictor:return: np.array([[],[]]), 68个特征点"""dets = face_detector(image, 1)shape = shape_predictor(image, dets[0])face_landmarks = np.array([[p.x, p.y] for p in shape.parts()])return face_landmarksdef get_face_mask(image_size, face_landmarks):"""获取人脸掩模:param image_size: 图片大小:param face_landmarks: 68个特征点:return: image_mask, 掩模图片"""mask = np.zeros(image_size, dtype=np.uint8)points = np.concatenate([face_landmarks[0:16], face_landmarks[26:17:-1]])cv2.fillPoly(img=mask, pts=[points], color=255)return maskdef get_affine_image(image1, image2, face_landmarks1, face_landmarks2):"""获取图片1仿射变换后的图片:param image1: 图片1, 要进行仿射变换的图片:param image2: 图片2, 只要用来获取图片大小,生成与之大小相同的仿射变换图片:param face_landmarks1: 图片1的人脸特征点:param face_landmarks2: 图片2的人脸特征点:return: 仿射变换后的图片"""three_points_index = [18, 8, 25]M = cv2.getAffineTransform(face_landmarks1[three_points_index].astype(np.float32),face_landmarks2[three_points_index].astype(np.float32))dsize = (image2.shape[1], image2.shape[0])affine_image = cv2.warpAffine(image1, M, dsize)return affine_image.astype(np.uint8)def get_mask_center_point(image_mask):"""获取掩模的中心点坐标:param image_mask: 掩模图片:return: 掩模中心"""image_mask_index = np.argwhere(image_mask > 0)miny, minx = np.min(image_mask_index, axis=0)maxy, maxx = np.max(image_mask_index, axis=0)center_point = ((maxx + minx) // 2, (maxy + miny) // 2)return center_pointdef get_mask_union(mask1, mask2):"""获取两个掩模掩盖部分的并集:param mask1: mask_image, 掩模1:param mask2: mask_image, 掩模2:return: 两个掩模掩盖部分的并集"""mask = np.min([mask1, mask2], axis=0)  # 掩盖部分并集mask = ((cv2.blur(mask, (5, 5)) == 255) * 255).astype(np.uint8)  # 缩小掩模大小mask = cv2.blur(mask, (3, 3)).astype(np.uint8)  # 模糊掩模return maskdef skin_color_adjustment(im1, im2, mask=None):"""肤色调整:param im1: 图片1:param im2: 图片2:param mask: 人脸 mask. 如果存在,使用人脸部分均值来求肤色变换系数;否则,使用高斯模糊来求肤色变换系数:return: 根据图片2的颜色调整的图片1"""if mask is None:im1_ksize = 55im2_ksize = 55im1_factor = cv2.GaussianBlur(im1, (im1_ksize, im1_ksize), 0).astype(np.float)im2_factor = cv2.GaussianBlur(im2, (im2_ksize, im2_ksize), 0).astype(np.float)else:im1_face_image = cv2.bitwise_and(im1, im1, mask=mask)im2_face_image = cv2.bitwise_and(im2, im2, mask=mask)im1_factor = np.mean(im1_face_image, axis=(0, 1))im2_factor = np.mean(im2_face_image, axis=(0, 1))im1 = np.clip((im1.astype(np.float) * im2_factor / np.clip(im1_factor, 1e-6, None)), 0, 255).astype(np.uint8)return im1def main():im1 = cv2.imread('1.png')  # face_imageim1 = cv2.resize(im1, (600, im1.shape[0] * 600 // im1.shape[1]))landmarks1 = get_face_landmarks(im1, detector, predictor)  # 68_face_landmarksif landmarks1 is None:# print('{}:检测不到人脸'.format(image_face_path))exit(1)im1_size = get_image_size(im1)  # 脸图大小im1_mask = get_face_mask(im1_size, landmarks1)  # 脸图人脸掩模cam = cv2.VideoCapture(0)while True:ret_val, im2 = cam.read()  # camera_imagelandmarks2 = get_face_landmarks(im2, detector, predictor)  # 68_face_landmarksif landmarks2 is not None:im2_size = get_image_size(im2)  # 摄像头图片大小im2_mask = get_face_mask(im2_size, landmarks2)  # 摄像头图片人脸掩模affine_im1 = get_affine_image(im1, im2, landmarks1, landmarks2)  # im1(脸图)仿射变换后的图片affine_im1_mask = get_affine_image(im1_mask, im2, landmarks1, landmarks2)  # im1(脸图)仿射变换后的图片的人脸掩模union_mask = get_mask_union(im2_mask, affine_im1_mask)  # 掩模合并affine_im1 = skin_color_adjustment(affine_im1, im2, mask=union_mask)  # 肤色调整point = get_mask_center_point(affine_im1_mask)  # im1(脸图)仿射变换后的图片的人脸掩模的中心点seamless_im = cv2.seamlessClone(affine_im1, im2, mask=union_mask, p=point, flags=cv2.NORMAL_CLONE)  # 进行泊松融合cv2.imshow('seamless_im', seamless_im)else:cv2.imshow('seamless_im', im2)if cv2.waitKey(1) == 27:  # 按Esc退出breakcv2.destroyAllWindows()if __name__ == '__main__':main()

6. 项目理解
整一个运行环境,所消耗的空间相对来说还是蛮小的,在笔记本上跑是完全没有问题的;项目的原理很简单:先利用电脑自带的摄像头进行实时的人脸采集,当采集人脸68个特征点时,摄像头打开,程序正常运行,反之。注意,这个是实时采集的,所以,当你的脸突然被东西遮住的时候,程序就异常结束。

7. 运行过程及结果
整一个项目也很简单,一张想要换脸的明星图片,一个python文件以及一个预测的可执行文件(特征采样),整体的换脸效果还是不错的,当然也是有缺陷的地方,不过玩玩还是可以的。



项目我也打包好了,想要免费试玩的朋友,Look here~

利用Python实现摄像头实时换脸相关推荐

  1. 摄像头实时换脸,上网课老师都不认识我了,哈哈

    环境与效果 python3.9.6 pycharm 2021 库环境: dlib opencv-python 视频图片效果如下: 摄像头实时换脸,老师都不认识我了!! 基本原理 使用dlib的shap ...

  2. python图色检测_利用python打开摄像头及颜色检测方法

    最近两周由于忙于个人项目,一直未发言了,实在是太荒凉了....,上周由于项目,见到Python的应用极为广泛,用起来也特别顺手,于是小编也开始着手学习Python,-下面我就汇报下今天的学习成果吧 小 ...

  3. python摄像头跟随人脸_Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  4. python实现面部特效_Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  5. python恶搞代码打开对方摄像头_Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示...

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  6. python调用摄像头转向_教你如何利用python调用摄像头

    这篇文章主要介绍了python调用摄像头的示例代码,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 一.打开摄像头 import cv2 import numpy as np def v ...

  7. 课程设计python调用摄像头_教你如何利用python调用摄像头

    导读 这篇文章主要介绍了python调用摄像头的示例代码,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 一.打开摄像头 import cv2 import numpy as np de ...

  8. 利用Python实现QQ实时到账 免签支付 原创

    原创 转载请注明出处 核心部分:解决QQ的登录验证问题 主要利用python的selenium库和QQ的快速登录实现登录网页 再利用抓到的json来输出今日的订单情况 直接上代码 import req ...

  9. python调用手机摄像头_教你如何利用python调用摄像头

    这篇文章主要介绍了python调用摄像头的示例代码,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 一.打开摄像头 import cv2 import numpy as np def v ...

最新文章

  1. Java源码详解六:ConcurrentHashMap源码分析--openjdk java 11源码
  2. 【计算机网络】网络层 : OSPF 协议 ( 协议简介 | 链路状态路由算法 | OSPF 区域 | OSPF 特点 )
  3. (2) 第二章 WCF服务与数据契约 服务契约详解(三)- [ServiceContract]特性
  4. linux mint 忘记密码,在Linux Mint中如何提醒mysql localhost base的密码?
  5. 树莓派命令行连接蓝牙音箱及不出声问题
  6. 冰点密码忘记了怎么办
  7. linux 2.6.32文件系统的dentry父子关系
  8. angular的生命周期
  9. cocos2dx 制作一个简单的三消游戏
  10. ZZULIOJ:1132: 数字字符统计
  11. mysql连接服务报错1058
  12. 计算机编程ebcdic码,EBCDIC和BCD码
  13. java使用poi逐页读取ppxt,JAVA-WEB(通过POI)实现PPT在线预览
  14. 科普:快速了解第三代半导体及什么是宽禁带半导体
  15. Veeam Availability Suite 9.5安装和配置
  16. 这 7 门 编程语言最适合新手学习
  17. 【MC 网易-我的世界-mod开发基础笔记】 --- 前期准备
  18. Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)
  19. 微星GS73VR 6RF + Linux Mint 18 + GTX1060 + CUDA8.0 + OpenCV3.0.0 + Caffe安装笔记
  20. hdoj 2036 改革春风吹满地 (多边形面积)

热门文章

  1. 全渠道营销+线上线下结合新零售数字门店saas系统
  2. Web前端——立体相册的制作
  3. MICCAI 论文投稿须知翻译
  4. P4944 PION贪吃蛇 题解
  5. mysql useing查询_MySQL查询优化一例——也说说 Using intersect
  6. 集束搜索beam search和贪心搜索greedy search
  7. 我用这个画3d图和电路图、上网,防止鼠标手
  8. fiddler图片替换
  9. java 数字大小写转换工具类--适用于打印收据
  10. docker之网络配置