还记得疫情之初,我们用Python给头像戴口罩的文章吗?

开工第一天,先用Python戴个口罩

当时只是简单的调用了第三方模块将口罩图片替换入原图,内容非常简短。

今天,将为大家提供一个能够通过以下三种方式给头像戴上圣诞帽的Python教程:

  • 1.实时打开摄像头读取头像图佩戴圣诞帽

  • 2.从本地读取一幅头像图佩戴圣诞帽

  • 3.从文件夹中批量读取头像图佩戴圣诞帽

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

此外,推荐大家用VSCode编辑器,因为它可以在编辑器下方的终端运行命令安装依赖模块:Python 编程的最好搭档—VSCode 详细指南。

Windows环境下打开 Cmd (开始-运行-CMD),苹果系统环境下请打开 Terminal (command+空格输入Terminal),输入命令安装依赖:

pip install https://pypi.python.org/packages/da/06/bd3e241c4eb0a662914b3b4875fc52dd176a9db0d4a2c915ac2ad8800e9e/dlib-19.7.0-cp36-cp36m-win_amd64.whl#md5=b7330a5b2d46420343fbed5df69e6a3f
pip install opencv-python

有两个依赖,一个是 dlib模块,需要通过whl文件安装。一个是常用的opencv模块,直接pip安装即可。

文章源代码fork自:amusi/Merry_Christmas_Hat

本文全部源代码及图片可在此下载:
https://github.com/Ckend/Merry_Christmas_Hat

如果你访问不了Github,可在Python实用宝典公众号后台回复:圣诞帽 下载。

2.给头像戴上圣诞帽

为防大家没耐心看下去,我把佩戴圣诞帽的教程提前了。

下载源代码后,进入源代码的文件夹,一共有三种方式给你的头像佩戴圣诞帽。

1.打开摄像头读取头像图:

当摄像头打开后,会实时出现佩戴着圣诞帽的你。按q保存你最喜欢的图片即可,源代码如下:

def method_one(hat_img):"""方式1: 打开摄像头读取头像图"""cap = cv2.VideoCapture(0)if not cap.isOpened():print('摄像头打开失败!')else:print('摄像头打开成功!')print("请按下键盘上的'q',保存当前满意图像!")while cap.isOpened():_, img = cap.read()cv2.imshow("img", img)k = cv2.waitKey(33) & 0xFFif(k == ord('q')):cv2.imwrite("sefile.jpg", img)face_flag, output = add_hat(img, hat_img)if(-1 == face_flag):breakcv2.imshow("output", output)print("请按下键盘上的任意按键,退出当前程序!")cv2.waitKey(0)cv2.imwrite("output.jpg", output)break# 读取帽子图,第二个参数-1表示读取为rgba通道,否则为rgb通道
hat_img = cv2.imread("hat.png", -1)# 选择你需要的方式
method_one(hat_img)cv2.destroyAllWindows()

这样,通过运行Merry_Chirstmas_Hat.py文件就能打开摄像头并实时显示佩戴圣诞帽的你:

python Merry_Chirstmas_Hat.py

2.读取一个图像佩戴圣诞帽

这是最常见的使用场景,你只需要的源代码文件夹下,放置你所需要佩戴圣诞帽的图像,命名为test.jpg(或其他,只需要改函数调用里你的指定文件名称)。

放置完成后运行Merry_Chirstmas_Hat.py文件即可佩戴圣诞帽。

def method_two(hat_img, filename):"""方式2: 从本地读取一幅头像图"""img = cv2.imread(filename)success, output = add_hat(img, hat_img)if not success:print("戴失败了!")return# 展示效果cv2.imshow("output", output)cv2.waitKey(0)cv2.imwrite("output.jpg", output)# 读取帽子图,第二个参数-1表示读取为rgba通道,否则为rgb通道
hat_img = cv2.imread("hat.png", -1)# 选择你需要的方式
method_two(hat_img, "test.jpg")cv2.destroyAllWindows()

3. 从文件夹中读取多张头像图(批量处理)

在源代码的文件夹下,创建一个名为images的文件夹,在里面放置所有以.jpg结尾的图像,运行Merry_Chirstmas_Hat.py文件后你能看到所有这些图像佩戴圣诞帽的效果。

def method_three(hat_img):"""方式3: 从文件夹中读取多张头像图(批量处理)"""import glob as gbimg_path = gb.glob("./images/*.jpg")for path in img_path:img = cv2.imread(path)# 添加帽子success, output = add_hat(img, hat_img)if not success:print("戴失败了!")continue# 展示效果cv2.imshow("output", output)cv2.waitKey(0)# 读取帽子图,第二个参数-1表示读取为rgba通道,否则为rgb通道
hat_img = cv2.imread("hat.png", -1)# 选择你需要的方式
method_three(hat_img)cv2.destroyAllWindows()

我们的代码默认使用了第二种方式佩戴圣诞帽,你可以修改代码178行的method选择你所需要的方式。佩戴效果如下:

原图:

佩戴效果图:

3.原理分析

在上面的三种佩戴圣诞帽方法中,都调用了一个叫 add_hat 的函数。

顾名思义,这个函数里对原图像做了佩戴圣诞帽的逻辑,其步骤如下:

  • 1. 正脸识别(才好佩戴帽子到头部)。

  • 2. 遍历所有人脸,取5个关键点,并根据人脸大小调整帽子大小。

  • 3. 利用alpha通道的图像提取放帽子的区域(提取空心区域)。

  • 4. 将原帽子覆盖至第3步提取出来的空心区域上并放回原图。

下面分步骤阐述:

1.正脸识别

利用了dlib中已经训练好的人脸关键点检测模型对图像进行提取人脸的操作:

# dlib人脸关键点检测器(需要确保.py文件同级目录下有shape_predictor_5_face_landmarks.dat这个文件)
predictor_path = "shape_predictor_5_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)# dlib正脸检测器
detector = dlib.get_frontal_face_detector()# 正脸检测
dets = detector(img, 1)

检测到的人脸数据将会保存到dets变量中,因此dets的长度将大于0.

2.遍历人脸,取关键点并调整帽子大小

获取保存的人脸数据的各种参数,并根据这些参数对帽子进行比例转化:

# 如果检测到人脸
if len(dets) > 0:# 遍历所有人脸for d in dets:x, y, w, h = d.left(), d.top(), d.right()-d.left(), d.bottom()-d.top()# 关键点检测,5个关键点shape = predictor(img, d)# 选取左(0)右(2)眼眼角的点point1 = shape.part(0)point2 = shape.part(2)# 求两点中心eyes_center = ((point1.x+point2.x)//2, (point1.y+point2.y)//2)# 根据人脸大小调整帽子大小factor = 1.5    # 比例因子resized_hat_h = int(round(rgb_hat.shape[0]*w/rgb_hat.shape[1]*factor))resized_hat_w = int(round(rgb_hat.shape[1]*w/rgb_hat.shape[1]*factor))# 避免帽子高度超出图像画面if resized_hat_h > y:resized_hat_h = y-1# 根据人脸大小调整帽子大小resized_hat = cv2.resize(rgb_hat, (resized_hat_w, resized_hat_h))

3. 利用alpha通道的图像提取放帽子的区域(提取空心区域)。

通过alpha通道生成的黑白图像作为mask,将其填充到原图中。生成了bg.jpg.

# 用alpha通道作为mask(bitwise_not)
mask = cv2.resize(a, (resized_hat_w, resized_hat_h))
mask_inv = cv2.bitwise_not(mask)# 帽子相对与人脸框上线的偏移量
dh = 0
dw = 0
# 原图ROI
bg_roi = img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)]# 原图ROI中提取放帽子的区域
bg_roi = bg_roi.astype(float)
mask_inv = cv2.merge((mask_inv, mask_inv, mask_inv))
alpha = mask_inv.astype(float)/255# 相乘之前保证两者大小一致(可能会由于四舍五入原因不一致)
alpha = cv2.resize(alpha, (bg_roi.shape[1], bg_roi.shape[0]))
bg = cv2.multiply(alpha, bg_roi)
bg = bg.astype('uint8')
cv2.imwrite("bg.jpg", bg)

如果你打开bg.jpg,你就会发现这是一个佩带黑色模板的原图帽子区域:

4.将原帽子覆盖至第3步提取出来的空心区域上并放回原图。

接下来要做的,就是将帽子替换到第3部生成的空心区域上并放回原图:

# 提取帽子区域
hat = cv2.bitwise_and(resized_hat, resized_hat, mask=mask)
cv2.imwrite("hat.jpg", hat)# 相加之前保证两者大小一致(可能会由于四舍五入原因不一致)
hat = cv2.resize(hat, (bg_roi.shape[1], bg_roi.shape[0]))# 两个ROI区域相加
add_hat = cv2.add(bg, hat)# 把添加好帽子的区域放回原图
img[y+dh-resized_hat_h:y+dh, (eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)] = add_hat
return 1, img

这样,便完成了整个佩戴圣诞帽的流程。文章完整源代码可在Python实用宝典公众号后台回复:圣诞帽 下载。

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

点击下方阅读原文可获得更好的阅读体验

Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

超简单 Python 头像戴圣诞帽教程相关推荐

  1. 超简单Python安全批量打水印教程

    原文来自Python实用宝典:超简单Python安全批量打水印教程! 工作的时候,尤其是自媒体,我们必备水印添加工具以保护我们的知识产权,网上有许多的在线/下载的水印添加工具,但他们或多或少都存在以下 ...

  2. python详细安装教程-超详细Python与PyCharm安装教程,看这一篇就够了

    原标题:超详细Python与PyCharm安装教程,看这一篇就够了 学习了三天的python, 之前测试一直用课程自带的网页版玩玩, 为了学习 然后就下载了一个python和pycharm 现在分享下 ...

  3. 超完整 Python基础入门知识教程

    本书旨在帮助Python开发人员发现该语言和相关库的突出特性,并编写简单.流畅.易于阅读和易于维护的代码.特别是生成器.属性描述符(ORM的键)和Python表达式的对象在数据库处理过程中的具体应用: ...

  4. 超简单的JNI——NDK开发教程

    不好意思各位,我按照网上一些教程进行JNI开发,折腾了半天也没成功,最后自己瞎搞搞定了,其实超简单的,网上的教程应该过时了,最新版的AS就包含了NDK编译的功能,完全不用手动javah,各种包名路径的 ...

  5. python在docx指定位置插表格_超简单Python将指定数据插入到docx模板指定位置渲染并保存...

    超简单Python将指定数据插入到docx模板渲染并生成 最近有一个需求,制作劳动合同表,要从excel表格中将每个人的数据导入到docx劳动合同中,重复量很大,因此可以使用python高效解决.为了 ...

  6. csv转为矩阵 python_超简单python脚本实现从resfinder+blast下机数据到csv抗性基因矩阵...

    今天还是在做张阿姨的项目,还是那100多个菌,她说要blast一下抗性基因,那就比咯,最出名与权威的的细菌抗性基因库自然肯定是resfinder了. for i in $(cat list); do ...

  7. python报告水印怎么弄_超简单Python安全批量打水印教程!

    工作的时候,尤其是自媒体,我们必备水印添加工具以保护我们的知识产权 网上有许多的在线/下载的水印添加工具,但他们或多或少都存在以下问题:在线工具需要上传到对方服务器,信息不安全. 很多工具不具备批量处 ...

  8. python 添加半透明水印_超简单Python安全批量加水印教程!

    工作的时候,尤其是自媒体,我们必备水印添加工具以保护我们的知识产权 ,网上有许多的在线/下载的水印添加工具,但他们或多或少都存在以下问题:在线工具需要将图片上传到对方服务器,信息不安全. 很多工具不具 ...

  9. 在职爬虫工程师,带给大家超简单 Python 爬虫教程

    本篇 Python 爬虫教程主要讲解以下5部分内容,请按照顺序进行学习. 爬虫概述:介绍什么是爬虫,爬虫的目的和应用. 爬虫基础知识:介绍爬虫的基本概念,例如网络协议,HTML 结构,CSS 样式表等 ...

最新文章

  1. raid5坏了一块盘怎么办_服务器阵列信息丢失,数据怎么办?先不要慌,也许很快就能恢复...
  2. 【收藏】批量导出docker镜像
  3. MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
  4. python PIL图像处理-框选
  5. java 高飞_高飞(土木与水利工程学院)老师 - 合肥工业大学
  6. 小白 LeetCode 5605 检查两个字符串数据是否相等
  7. 12 个非常有用的 JavaScript 技巧
  8. ffmpeg实战教程(六)Android CMake实现解码(MP4转YUV)
  9. 计算机操作系统之CPU架构和原理(二)
  10. 如何计算十五个字节(多字节)的CRC16校验
  11. 牛客网-前端刷题记录(简单级)
  12. Android 中的长度单位详解(dp、sp、px、in、pt、mm)具体解释与换算
  13. element中el-select实现拼音搜索(el-autocomplete等下拉框搜索都可添加)
  14. nuxt如何添加背景图片
  15. 面试热问——你的职业规划是什么?
  16. Task 编程中的异常处理
  17. 公网IP/内网IP:
  18. ROS | launch启动文件的使用
  19. MySQL - binlog 图文详解
  20. 盛世昊通董车长2.0,拼车车运营模式解读

热门文章

  1. 搞懂回溯算法,我终于能做数独了
  2. vue入门之04-生命周期 数据共享
  3. 三菱Plc怎么用c语言编程,如何用程序在三菱PLC上写出配方功能
  4. JavaScript初学入门(JS打印9*9乘法表,JS制作简易计算器)
  5. 电话机器人成骚扰机器?程序员可不背锅
  6. c语言中eof的作用,C语言中,怎么用EOF结束输入?
  7. 笔记本电脑上的触摸板怎样关闭(神州战神)
  8. 心灵的吟唱——读《湖海诗情录》
  9. OpenCV VideoCapture使用方法(视频文件、摄像头、网络视频文件)
  10. 4)自适应滤波(一)[LMS算法]