作者 | Leauky,北理工硕士在读,非CS专业的Python爱好者。

朋友圈里@微信官方要求戴圣诞帽的活动曾经火爆一时,有些会玩的小伙伴都悄咪咪地用美图秀秀一类的 app 给自己头像 p 一顶,然后可高兴地表示“哎呀好神奇hhhh”,呆萌的小伙伴当然就一直等啊等... ...作为一名坚信“用技术解决需求”的萌新,在一个无聊的周末尝试用python来搞一波事情。

主要思路

准备两张图:一张头像,一张帽子。先用人脸识别定位头像中的人脸,给出人脸像素坐标;再根据这个坐标确定帽子放置的坐标;最后将两张图片拼接后输出。(需要注意的是,帽子是不规则图像,除了主体外背景应该是透明的,因此必须是四通道png格式)。gakki 酱亲自演示如下:

示意图

问题展开

1. 人脸识别怎么搞定?(重新造轮子?不存在的,这辈子都不可能造轮子的)。Github上一个开源的python人脸识别库face_recognition双手奉

https://github.com/ageitgey/face_recognition#face-recognition

据说识别率99.38%(顶瓜瓜啊!)。通过安装这个库就可以调用人脸检测器。

2. 确定了帽子的放置位置,怎么拼接图层?这个属于基本的图像操作,python提供了PIL(Python Image Lib)这么一个库来进行图像处理,具体操作请看后面的代码。

库的安装

我的环境是Ubuntu 16.04+Python2.7.12。使用Window,Mac OS和Python3的同学也可以参考,都是类似的。face_recognition这个库比较事儿,安装前需要依次安装boost(boost_python),cmake,dlib这几个依赖和库,中间出现任何问题都可以通过Google解决(懒得写 -.. -)。安装完所有的依赖后,使用命令:

1pip install face_recognition
2pip install pillow #PIL库

完成后就可以在你的python脚本里import face_recognition和PIL了。

代码分析

Talk is cheap, show me the code。直接上代码:

1from PIL import Image
2import face_recognition
3img_path = raw_input("image path:")
4image = face_recognition.load_image_file(img_path)
5face_locations = face_recognition.face_locations(image)
6print("Found {} face(s) in this photograph.".format(len(face_locations)))

第1、2行导入PIL库中的Image模块和face_recognition库。第3行,等待用户输入头像图片的路径。第4行,把路径所指的图像数据读入image中。第5行,调用face_locations处理image中的图像数据,对图片中的人脸进行识别定位,定位后的得到的像素坐标数据放在face_locations里。第6行在shell里输出图片里识别到的人脸的个数。

7human_img = Image.open(img_path)
8human_img = human_img.convert("RGBA")
9hat_img = Image.open("./hat.png")
10hat_img = hat_img.convert("RGBA")

第7、8行,把路径所指的图像数据读入human_img中,并转换为四通道RGBA模式。9、10行读入帽子图像并做相同处理。

11for face_location in face_locations:
12    top, right, bottom, left = face_location
13    top -= 10
14    print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))
15    head_h = bottom-top#hight of head
16    head_l = right-left#length of head
17    hat_img = hat_img.resize( (head_l,head_h) )#convert size of hat
18    hat_region = hat_img
19    human_region = ( left, top-head_h, right, top )
20    human_img.paste(hat_region, human_region,mask=hat_img)
21human_img.show()

如果一张图里有多张人脸,face_recognition.face_locations(image)会返回每张人脸的位置信息,存放在一个list里。因此第11行是遍历face_locations里的每张人脸的数据。第12行解包一个人脸像素坐标数据,得到top,right,bottom,left分别为示意图中的y1,x2,y2,x1。第13行,为啥y1要减10个像素?因为人脸识别得到的y1最多到你额头的位置,所以再把这个坐标往上提一提帽子才戴得更自然。第14行输出坐标数据方便调试。第15、16行计算人脸的高度和宽度。第17行使用resize()根据人脸的大小调整帽子的大小,因为图像中的人脸有大有小,调整后看起来更和谐。第18行,将帽子图像作为顶部图层图像。第19行,确定底部图层(头像图片)被覆盖的区域(就是帽子放置区域)。第20行,把顶部图层与底部图层拼接(不太明白的看下图)。然后一个循环结束,亦即完成图片中一个人的戴帽操作,接着进行下个人的戴帽,直到所有人都戴上了帽子。最后21行,完成输出~

更新

更多人脸:

源码链接(提取密码:3979)

https://pan.baidu.com/share/init?surl=i53rGH3

(*本文为作者投稿文章,转载请联系原作者)


公开课预告

全双工语音

本期课程中,微软小冰全球首席架构师及研发总监周力博士将介绍微软小冰在全双工语音对话方面的最新成果,及其在智能硬件上的应用和未来将面临的更多技术产品挑战。

推荐阅读

  • Python的P图大法,你值得拥有!

  • 维基百科联手谷歌翻译,结果“惨不忍睹”!

  • AI删库,程序员背锅?

  • 刚刚!程序员集体荣获2个冠军,这份2018 IT报告还说这些!

  • 边缘计算精华问答 | 为什么需要边缘计算?

  • 吃亏的程序员,是如何拿到了 9 个月的年终奖?

  • Grin带火的MinbleWimble技术,到底是个什么鬼?

20行Python代码给微信头像戴帽子相关推荐

  1. python微信头像_转:20行Python代码给微信头像戴帽子

    https://blog.csdn.net/weixin_42232219/article/details/86486222 https://zhuanlan.zhihu.com/p/32299758 ...

  2. pil python 安装_20行Python代码给微信头像戴帽子

    作者 | Leauky,北理工硕士在读,非CS专业的Python爱好者. 朋友圈里@微信官方要求戴圣诞帽的活动曾经火爆一时,有些会玩的小伙伴都悄咪咪地用美图秀秀一类的 app 给自己头像 p 一顶,然 ...

  3. python微信头像_20行Python代码给微信头像戴帽子

    朋友圈里@微信官方要求戴圣诞帽的活动曾经火爆一时,有些会玩的小伙伴都悄咪咪地用美图秀秀一类的 app 给自己头像 p 一顶,然后可高兴地表示"哎呀好神奇hhhh",呆萌的小伙伴当然 ...

  4. 20行 Python 代码爬取王者荣耀全英雄皮肤 | 原力计划

    作者 | wangweijun 责编 | Elle 出品 | CSDN 博客 引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王 ...

  5. 项目分享丨20行Python代码,无损压缩千百张图片!

    前言 每个设计师.摄影师或有图片处理需求小编,都会面临批量高清大图的困扰. 因为高清大图放到网站上会严重拖慢加载速度,或是有的地方明确限制了图片大小,因此,为了完成工作,他们总是需要先把图片压缩,再上 ...

  6. python小游戏代码大全-20行python代码的入门级小游戏的详解

    背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手 ...

  7. 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...

  8. python视频压缩算法_Python入门到精通视频,阿里巴巴大力推荐,20行Python代码,无损压缩千百张图片!...

    阿里巴巴推荐,Python基础入门,Python小白书籍,Python学习路线,Python进阶,Python高级,Python爬虫等等一系列关于Python的文档和视频(包括hadoop,fink, ...

  9. 20行Python代码爬取王者荣耀全英雄皮肤改进版

    0 写在前面 看了大神的这篇CSDN:20行Python代码爬取王者荣耀全英雄皮肤访问量那么高,忍不住想要蹭一下热点,但是蹭归蹭,总得有点货才行,于是我品我细品,发现其代码总体有三点我觉得值得改进的地 ...

最新文章

  1. 英伟达GPU“屠榜”,谷歌TPU“退赛”,MLPerf最新推理榜单出炉
  2. rehl7.3部署K8s集群
  3. 有关定时任务的表达式--cron 详细解
  4. birt脚本for循环_Shell脚本编程2 for循环/while循环
  5. Redis的内存淘汰策略
  6. 数据库设计_数据库设计(一)分析及逻辑设计
  7. mysql5.7.24免安装版配置及密码初始化及mysql-font连接异常
  8. python global用法_Python 虚拟环境全知道
  9. sublime text 3 输入中文 linux,解决 Linux 下 Sublime Text 3 中文无法输入问题
  10. 适合iOS的15大网站推荐
  11. Fiji-imageJ 无法打开
  12. 51单片机--蜂鸣器
  13. 关于推荐算法未来的思考:推荐诗与远方
  14. 计算机联锁中JDF是什么组合,2019年新准线海勒斯壕南站站改工程招标公告
  15. 广发卡分期可商户分期啦
  16. 自动关闭当前的Fragment返回上一个Fragment该如何实现
  17. 带宽与码元的关系_数据速率、载波频率和带宽的关系
  18. 【详细整理机房布线工艺,布出更快更漂亮的网线!】
  19. Verilog设计_乘法器
  20. 【Python】tkinter点击按钮后获取按钮本身

热门文章

  1. Percona-Server-5.5.30安装
  2. Kafka面试题及答案整理 110道 (持续更新)
  3. java中引用类型_您真的了解Java中的4种引用类型吗?
  4. 2018-4-7 进化类算法------1、遗传算法(GA)
  5. 老王Python-进阶篇4-异常处理1.3(周末习题)
  6. C# Sato CL4NX打印机发送SBPL指令打印表面信息、RFID芯片数据写入
  7. 夺命雷公狗---linux NO:3 centos_mini版的安装和备份
  8. xmpp关于后台挂起的消息接收,后台消息推送,本地发送通知
  9. 正则表达式的字符、说明和其简单应用示例
  10. LA 5717枚举+最小生成树回路性质