专栏首页企鹅号快讯不用@微信官方了,Python20行自动戴帽!

不用@微信官方了,Python20行自动戴帽!

这两天被朋友圈里@微信官方要求戴帽的消息刷屏了,会玩的都悄咪咪地用美图秀秀一类的app给自己头像p一顶然后可高兴地表示“哎呀好神奇hhhh”,呆萌的当然就一直等啊等。作为一名坚信“用技术解决需求”的萌新,在这个无聊的周末尝试用python来搞一波事情。

主要思路

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

问题展开

人脸识别怎么搞定?(重新造轮子?不存在的,这辈子都不可能造轮子的)。Github上一个开源的python人脸识别库face_recognition双手奉上,据说识别率99.38%(顶瓜瓜啊!)。通过安装这个库就可以调用人脸检测器。

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

库的安装

我的环境是Ubuntu 16.04+Python2.7.12。使用Window,Mac OS和Python3的同学也可以参考,都是类似的。

face_recognition这个库比较事儿,安装前需要依次安装boost(boost_python),cmake,dlib这几个依赖和库,中间出现任何问题都可以通过Google解决(懒得写 -.. -)。安装完所有的依赖后,使用命令:

pip install face_recognition

pip install pillow#PIL库

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

代码分析

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

1. from PIL import Image

2. import face_recognition

3 img_path = raw_input("image path:")

4. image = face_recognition.load_image_file(img_path)

5. face_locations = face_recognition.face_locations(image)

6. print("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里输出图片里识别到的人脸的个数。

7. human_img = Image.open(img_path)

8. human_img = human_img.convert("RGBA")

9. hat_img = Image.open("./hat.png")

10. hat_img = hat_img.convert("RGBA")

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

11. for 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)

21. human_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行,完成输出~

更多测试结果~

本文来自企鹅号 - Embark有方博雅媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DevOps之Gitlab-Runner

    背景 Gitlab-Runner是一款用于执行软件集成脚本的工具,它配合Gitlab-CI使用,是Gitlab代码管理工具的一部分。当软件工程师提交代码到Git...

    企鹅号小编
  • 基于Python的人脸识别库,离线识别率高达99.38%!

    -欢迎 原文该项目是要构建一款免费、开源、实时、离线的网络 app,支持组织者使用人脸识别技术或二维码识别所有受邀人员。有了世界上最简单的人脸识别库,使用 Py...

    企鹅号小编
  • golang入门-1-简介

    Golang 简称 Go,是谷歌2009发布的开源编程语言,在2012年早些时候发布了Go 1稳定版本。 Go是从2007年末由Robert Griesemer...

    企鹅号小编
  • 使用lrucache和diskLrucache实现照片墙

    其实,在真正的项目实战当中如果仅仅是使用硬盘缓存的话,程序是有明显短板的。而如果只使用内存缓存的话,程序当然也会有很大的缺陷。因此,一个优秀的程序必然会将内存...

    xiangzhihong
  • 爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别

    在我们写爬虫的过程中,目标网站常见的干扰手段就是设置验证码等,本就将基于Selenium实战讲解如何处理弹窗和验证码,爬取的目标网站为某仪器预约平台

    刘早起
  • httpd启动报错LIBXML2_2.9.0 not defined ...

    _simple
  • 1分钟链圈|研究发现:今年全球ICO融资额近53亿美元!何玺:挖矿将成平民化运动,或可助国产“芯片”弯道超车

    区块链大本营
  • 解读 | 以花为媒,真能带动赏花旅游经济的发展?

    ? “春路雨添花,花动一山春色”。三月中旬开始,全国进入桃李争艳、百花闹春时节,刚结束的清明小长假使赏花游成为开启春季旅游热的新序章。 各地版本的“赏花地图”...

    腾讯文旅
  • elasticsearch实践之代码结构设计

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    林老师带你学编程
  • Python办公自动化|从Excel到Word

    在前几天的文章中我们讲解了如何从Word表格中提取指定数据并按照格式保存到Excel中,今天我们将再次以一位读者提出的真实需求来讲解如何使用Python从Exc...

    刘早起

扫码关注云+社区

领取腾讯云代金券