给图片中的人脸添加特效(帽子)

人脸特效流程和原理拆解

1数据准备

首先要准备帽子和人脸照片,加载到项目的目录中

2人脸检测

首先调用OpenCV中的库函数对照片进行人脸检测,得到人脸矩形的各参数值,从而可以得到帽子要加在什么位置上去,由于人脸照片和帽子照片的大小位置的不同,所以当我们要将两个照片进行拼接的时候就得取人脸的上部分即额头的那一部分(如下图)

之后按照这个尺寸重新规划帽子的尺寸。

3灰度化帽子

因为我们要想得到两张照片拼接的样子,这就必须得用到OpenCV的另一个对图像处理的函数按像素相或的操作,所以我们需要准备出两张照片:1彩色帽子,黑色背景,2黑色帽子人额头和彩色背景
所以我们可以通过灰度二值化来减小问题的规模,因为RGB在这里是没有用的,保留反而会增加问题的复杂度,所以我们将帽子图片变成灰白的。

4阈值化帽子

灰度化操作之后就要将帽子变成黑白两色类似于0和1(255),全0为黑。我们不妨规定当灰度值大于10认定为是白色。

5取反帽子

顾名思义,白色帽子黑色背景的照片变成黑色帽子白色背景,为什么要这样做呢,别急看下一步。

6将黑帽子和白背景与人脸像素相与

利用OpenCV的按像素与操作将上一步得到的图片和之前的展示的人额头图片相与即可得到下幅图

7将白帽子黑背景与彩色帽子相与

将之前步骤获得的白色帽子黑背景的图片与相同比例的彩色帽子照片相与即可得到下面的图

有些伙伴可能会说这张图和一开始准备的帽子图有什么区别吗,唯一的区别就是这张图的尺寸是和人的额头那一种截取的照片是完美匹配的。

8将上两步的结果相或

这一步也能解决上一步中小伙伴存在的困惑,只有两张图尺寸完全一样才可以相或,最终的图片效果为下图所示

之后将这一部分图像直接在相应的位置赋值给原来的人脸图片即可得到最终的样式图。

视频特效制作

这里跟上面的主要区别就是从对图片的处理转移到视频的处理,方式很简单,就是把视频里的某一些等间隔的帧进行取出进行类似于图片处理的操作即可,这里直接上代码,注释也标得很清楚。

# -*- coding:utf-8 -*-
"""
日期:2021年10月24日
"""
import cv2  # 图像处理的opencv库
import math  # 数学运算库
import dlib  # 加载dlib算法模块
import argparse  # 加载解析模块def hat_face(opt):# 加载dlib自带的人脸检测模型detector = dlib.get_frontal_face_detector()# 读取帽子样式的图片img_hat = cv2.imread(opt.hat_path)# 使用opencv中的VideoCapture函数,读取视频cap = cv2.VideoCapture(opt.video_path)# 初始化定义frame_id,便于后面跳帧frame_id = 0# 判断cap是否读取成功while cap.isOpened():# 因为视频采集,每秒可能会采集N帧图片,因此使用read函数,逐帧读取图片# ret 返回True或Fasle,表示是否读取到图片# frame 返回读取的图片信息ret, frame = cap.read()# 如果ok为false,则采集结束if not ret:# 打印输出,提示信息print("Camera cap over!")continue# frame_id加1,便于跳帧frame_id += 1# 如果frame_id除以10,不等于0,则不断循环,只有等于0时,才进行到下面的显示步骤,这样可以达到跳帧的效果# 因为在算法处理中,比如一秒有25帧图像,为了提升项目速度,没有必要对每一帧都进行算法处理# 注意:这里的10可以自行设置,如觉得跳帧太慢,可以设置大一些,比如15if not int(frame_id) % 10 == 0: continue# 对读取的原始图像,进行人脸检测faceRects = detector(frame)# 如果len(faces)>0,则说明图片上存在人脸if len(faceRects) > 0:# 图片中可能存在多张人脸,依次遍历输出每张人脸的位置信息,并在特定位置,添加兔子帽子特效for box_info in faceRects:# dlib检测出的人脸位置信息,为rectangle类型,所以可以通过left()、top()、right()、bottom()提取人脸框左上角的x0,y0,右下角的x1,y1。x0, y0, width_face, height_face = box_info.left(), box_info.top(), box_info.right() - box_info.left(), box_info.bottom() - box_info.top()# 获得帽子图片的高height_hat,宽width_hat,便于后面控制帽子显示的大小height_hat, width_hat = img_hat.shape[0], img_hat.shape[1]# 将帽子的高度变成,适合检测到的脸型的大小imgComposeSizeH = int(height_hat / width_hat * width_face)# 因为帽子在脸部上方,当脸部靠近视频顶部,为了保证帽子能显示出来,帽子的高度默认为脸部到视频上方的距离if imgComposeSizeH > (y0 - 20):imgComposeSizeH = (y0 - 20)# 将帽子的图片归一化到适合的宽和高大小,宽度为人脸的宽度,高度为上面调整后的帽子高度imgComposeSize = cv2.resize(img_hat, (width_face, imgComposeSizeH), interpolation=cv2.INTER_NEAREST)# 为了实现在人脸上方的额头,添加兔子帽子特效,只需要将兔子帽子贴到额头处即可# 注意:y0是人脸检测框左上方顶点的y坐标,y0-20,则差不多定位到额头处,再减去imgComposeSizeH,调整后兔子帽子的高度#      即从这个位置开始贴合兔子帽子,可以实现人脸帽子特效top = (y0 - 20 - imgComposeSizeH)# 当人脸太靠近图片上方,通过前一行的计算,有可能为负数,所以当出现这样的情况时,top设置为0if top <= 0:top = 0# 获得调整尺寸后,帽子新的高height_hat_new,新的宽width_hat_newheight_hat_new, width_hat_new = imgComposeSize.shape[0], imgComposeSize.shape[1]# 将额头上方,对应的帽子区域截取出来# 注意:通常从大图中抠取小图的方式,比如待截取小图的坐标是[x0,y0,x1,y1],则使用img[y0:y1,x0:x1即可]即可。small_img_hat = frame[top:top + height_hat_new, x0:x0 + width_hat_new]# 如需查看,上一行的效果,可将cv2.imwrite前面的#取消,运行后,保存到本目录查看# cv2.imwrite("small_img_hat.jpg",small_img_hat)# 将帽子图像,从RGB彩色图像转换为灰度图像small_img_hat_gray = cv2.cvtColor(imgComposeSize, cv2.COLOR_RGB2GRAY)# 如需查看,上一行的效果,可将cv2.imwrite前面的#取消,运行后,保存到本目录查看# cv2.imwrite("small_img_hat_gray.jpg", small_img_hat_gray)# 阈值化处理,将10<像素<255区间的图像抠出来# 因为背景为黑色,所以阈值设置10到255,即可将帽子区域提取出来ret, mask_hat = cv2.threshold(small_img_hat_gray, 10, 255, cv2.THRESH_BINARY)# 如需查看,上一行的效果,可将cv2.imwrite前面的#取消,运行后,保存到本目录查看# cv2.imwrite("mask_hat.jpg", mask_hat)# 使用取反操作,将帽子的图像从黑色0变为白色255,将白色255变成黑色0mask_hat_inv = cv2.bitwise_not(mask_hat)# 如需查看,上一行的效果,可将cv2.imwrite前面的#取消,运行后,保存到本目录查看# cv2.imwrite("mask_hat_inv.jpg", mask_hat_inv)# 使用按位与操作,将抠出的帽子区域和取反后的帽子图像相加img1_bg = cv2.bitwise_and(small_img_hat, small_img_hat, mask=mask_hat_inv)# 如需查看,上一行的效果,可将cv2.imwrite前面的#取消,运行后,保存到本目录查看# cv2.imwrite("img1_bg.jpg", img1_bg)# 使用按位与操作,将像素值在[10,255]之间的帽子RGB区域抠取出来img2_fg = cv2.bitwise_and(imgComposeSize, imgComposeSize, mask=mask_hat)# 如需查看,上一行的效果,可将cv2.imwrite前面的#取消,运行后,保存到本目录查看# cv2.imwrite("img2_fg.jpg", img2_fg)# 将img1_bg和img2_fg相加,等于戴了帽子的区域图像dst = cv2.add(img1_bg, img2_fg)# 如需查看,上一行的效果,可将cv2.imwrite前面的#取消,运行后,保存到本目录查看# cv2.imwrite("dst.jpg", dst)# 将带了帽子的局部区域,贴合到原始图像上frame[top:top + height_hat_new, x0:x0 + width_hat_new] = dst# 如需查看,上一行的效果,可将cv2.imwrite前面的#取消,运行后,保存到本目录查看# cv2.imwrite("img.jpg", img)# 很多时候,图片的长宽太大,屏幕显示不全# 为了便于查看图片,可以将图片的大小,缩放到某一尺寸,比如(800,600),即宽800像素,高600像素img = cv2.resize(frame, (800, 600))# 显示图片cv2.imshow("image", img)# 显示图片停顿的时间,如果是0,则一直显示。如果是100,则显示100mscv2.waitKey(10)if __name__ == '__main__':# 新建一个解析器parser = argparse.ArgumentParser()# 为解析器添加选项,比如video_path,添加视频地址。(在default后面,添加需要读取的视频路径)# 注意:如果需要抓取本电脑的摄像头采集的实时视频,可以设置default=0(注意不是default='0')# 注意:不同的视频,宽高大小可能不同,大家可以根据自己的视频比例,调试前面的的cv2.resize中的数值,修改显示窗口的大小。parser.add_argument('--video_path', default='video.mov', help='path of cap video')# 为解析器添加选项,比如hat_path,添加帽子图片的地址,可以更换其他样式的帽子尝试。(在default后面,添加需要读取帽子图片路径)parser.add_argument('--hat_path', default="maozi.png", help='path of hat image')# 解析选项的参数opt = parser.parse_args()# 调用hat_face函数,对视频中的人脸添加帽子的特效hat_face(opt)

下面附上某一帧的样式图

心得体会

又是本周最后一作,又是在熄灯之后结束,时间过得真快啊,我们人生只有一次,如何在有限的人生中选择正确的适合我们自己的事并且努力将它们做出自己的风格,留下属于自己的痕迹,这始终是需要我们思考的。规划和执行力始终是这个时代最重要的一par.
Goodbye, my dear friend!
Best wishes!
Hope everything work out!
salute!!!

关注我,点赞投币和收藏,AI学习和生活不迷路!

给图片中的人脸添加特效(帽子)相关推荐

  1. 机器视觉实验四: 为人脸添加装饰物特效实验(OpenCV-python代码)

    一. 实验目的 用OpenCV编写一个程序能检测出给定图像中的人脸,并能给人脸添加一些装饰特效,比如给人脸加上戴眼镜或带口罩或戴帽子等装饰物. 二.实验要求 1.用OpenCV编写一个程序能检测出给定 ...

  2. 基于GAN的人脸魔法特效

    文章转自"我爱计算机视觉",原文链接基于GAN的人脸魔法特效 01 什么是GAN? 生成对抗网络(GAN, Generative Adversarial Networks)是近年来 ...

  3. 人脸口罩识别——人脸添加口罩方法masked_faces

    文章目录: 1 人脸添加口罩masked_faces 2 添加口罩原理 3 添加口罩代码操作 4 源码分析 A realistic approach to generate masked faces ...

  4. 如何给视频添加特效字幕?分享一个简单好用的办法

    如何给视频添加特效字幕?现如今短视频剪辑已经十分普遍,我们在日常生活中也是经常需要接触到.说到短视频剪辑,可能大家心中多少都有点好奇.其实剪辑短视频并没有你们想象中的那么复杂,我们只需要准备好相应的素 ...

  5. 视频批量剪辑:如何给视频添加特效,比如:色彩变幻效果特效,怎么制作?

    视频太多,如何给视频添加特效,比如:色彩变幻效果特效,要如何制作?可以批量操作吗?可以,今天就让小编来教教大家如何去批量给视频添加色彩变幻效果特效功能 首先第一步,我们要进入视频剪辑高手并在上方三个板 ...

  6. 【opencv人脸识别1】从图片中检测人脸

    [opencv人脸识别一]从图片中检测人脸 本系列主要讲述利用opencv实现人脸识别的相关知识,并给出实际代码.且循序渐进,由基础到复杂,从最基本的图片检测人脸到视频检测.识别人脸,再到较大型人脸数 ...

  7. 传奇服务器端武器特效怎么修改,辐射4 装备效果自定义修改教程 怎么给装备添加特效...

    辐射4 装备效果自定义修改教程 怎么给装备添加特效 一个装备有名称,数值(攻击或防御),效果,一个装备只能有一个效果,游戏里叫做物品效果,ENCH,传奇特效属于改造配件而不属于物品效果,跟传奇锻造mo ...

  8. 【Python】批量检测图片中的人脸并制作数据集(Dlib)

    文章目录 写在前面 安装依赖 素材准备 单图预览 多图预览 人脸检测 数据处理 最终结果 代码仓库 写在前面 本教程教你使用卷积神经网络深度学习模型批量检测图片中的人脸,并制作人脸数据集. 安装依赖 ...

  9. 用python实现给人脸带圣诞帽子

    圣诞节到了,给广大程序员一个撩妹的小技巧,给图片上的人脸配上不同的圣诞帽. 1.首先,得去opencv上下载个图形识别库,代码实现时需要. 网站为:https://opencv.org/ 点击下载对应 ...

最新文章

  1. 深度学习常见问题解析
  2. java异常详细讲解_Java异常处理机制的详细讲解和使用技巧
  3. java面试总结之一
  4. html页面获取关闭页面事件,html页面关闭事件
  5. Retrofit2源码解析——网络调用流程(下)
  6. ENVI支持下利用高分辨率影像城市绿地信息提取方案
  7. C++ 11 深度学习(一)auto、头文件防卫、引用、常量
  8. markdown与word相互转换的快捷方法
  9. PRIMARY KEY 与 UNIQUE
  10. Python之configparser模块详解和使用
  11. 没有期刊申请清华博士_ICLR飞升,IJCAI降级:清华的新版AI顶会评级引发学术圈热议...
  12. matlab 求解线性规划问题
  13. 网站和搜索引擎是分工协作的伙伴关系
  14. join --- connet string
  15. Pandas 中文API文档
  16. 英特尔傲腾内存linux,英特尔一面优化傲腾可持续内存性能 一面不忘科普
  17. matlab中怎么输入参数,matlab中输入参数命令
  18. 结巴分词--关键词抽取
  19. windows按照title开启和关闭进程
  20. MapReduce系列之MapReduce的输出

热门文章

  1. 论文常用图表四:Bland-Altman图【MedCalc】
  2. 对位带操作的理解和应用
  3. WebDriver常用的鼠标/键盘操作
  4. 用C#编写三角形面积计算程序(附源码)
  5. 答题库 php,CSS+jQuery+PHP+MySQL实现的在线答题功能
  6. 质量检验(三)——检验手册、检验指导书
  7. 建宇一体秤兼容大华通讯秤如何设置
  8. java转安卓学习为了未来更深远的成长
  9. C语言:if(a)——if(!a)——if(a!=0)——if(a==0)有什么区别?
  10. CAD专业素材免费分享