作者 | 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_recognition2pip install pillow #PIL库

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

代码分析

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

1from PIL import Image2import face_recognition3img_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_location13 top -= 1014 print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))15 head_h = bottom-top#hight of head16 head_l = right-left#length of head17 hat_img = hat_img.resize( (head_l,head_h) )#convert size of hat18 hat_region = hat_img19 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行,完成输出~

更新

更多人脸:

pil python 安装_20行Python代码给微信头像戴帽子相关推荐

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

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

  2. 20行Python代码给微信头像戴帽子

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

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

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

  4. python电子相册制作代码大全_20 行 Python 代码即可制作精美证件照

    无论是我们上学时还之后的工作中,基本都需要用到电子证件照片,这类照片基本都对照片尺寸.背景色有要求,本文我们来看一下如何只用不到 20 行 Python 代码完成证件照片的制作. 简介 制作证件照我们 ...

  5. python 解压js压缩的图片_20行Python代码,无损压缩千百张图片!Python有多强!就不用说了...

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

  6. python 作物识别_20行Python代码开发植物识别 app

    这篇文章介绍如何用Python快速实现一个植物识别的app,家里养了几盆多肉还叫不上名字,正好拿来识别一下.实现这样一个app只需要20行左右的代码,先来看下效果: 另外,我也开发了微信小程序版本,大 ...

  7. python pdf编辑开发_20行Python代码实现一款永久免费PDF编辑工具的实现

    PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献.文档...很多都是PDF格式.它以格式稳定的优势,使得我们在打印.分享.传输过程 ...

  8. python电影评论情感分析_20行Tensorflow代码实现电影评论情感分析

    原标题:20行Tensorflow代码实现电影评论情感分析 背景 情感分析有很多的应用场景,比如做一个电商网站,卖家需要时刻关心用户对于商品的评论是否是正面的.再比如做一个电影的宣传和策划,电影在键盘 ...

  9. python 制作字符视频_20行Python代码实现视频字符化功能

    我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来.看起来是非常高端,但是实际实现起来确是非常简单,我们只需要接触opencv模块,就能很快的实现视频字符化.但是在此之前 ...

最新文章

  1. 201621123068 Week04-面向对象设计与继承
  2. python程序实例电话本-零基础案例,别再错过了,动手Python做一个电话本小程序!...
  3. tfidf处理代码_tfidf.txt
  4. jquery 父元素相邻元素_Jquery中几种查找节点的方法
  5. python猜名词甲乙丙_用python实现了一下:甲乙两人互猜数字(数理逻辑)
  6. 分享一个.NET(C#)按指定字母个数截断英文字符串的方法–提供枚举选项,可保留完整单词...
  7. 全球最贵红绿灯之谜得解,原来是百度Apollo的B面
  8. 转场动画UINavigationControllerDelegate
  9. java调用闭包对象_任务不可序列化:java.io.NotSerializableException仅在类而不是对象上调用闭包外的函数时...
  10. 记一次python分布式web开发(利用docker)
  11. lisp用entmake生产圆柱体_液态基酒生产
  12. Microsoft Office Visio 2007 免费下载
  13. 保定市身份证前6位代表地
  14. 苹果手机不和安卓手机比堆料的原因
  15. linux 脚本usleep,Linux的sleep()和usleep()的使用
  16. 晓说2017-定期持续更新
  17. 让你的linux fedora 超过mac帅
  18. 企业名录种类有哪些 企业名录作用
  19. linux pppoe配置文件,linux pppoe服务器配置
  20. 使用Adobe Acrobat设置pdf的页码

热门文章

  1. c++如何禁用指定的键盘布局_Karabiner Elements for Mac 键盘键位自定义改键工具
  2. JFinalOA导出Excel
  3. 软件设计师 - 常用公式
  4. java的整数扩展,浮点数扩展,字符扩展,转义字符,布尔值扩展
  5. 里用gam使用_第一次使用Roam一头雾水?
  6. jq之$(“tr:odd“).css(“background-color“,“red“);
  7. 2020计算机语言排行 rust,RedMonk 2020 年 Q3 编程语言排行:Rust 首次进入前 20
  8. form表单图片预览 layui_layui 实现图片上传和预览
  9. 负数比较大小_人教版六下【第一单元】负数比较负数的大小
  10. springboot幂等性_请问,springboot项目支付接口设计,如何保证支付的幂等性,并能给前端反馈友好的提示?...