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

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

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

主要思路

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

3746fd85be56984f260a2d2acd46ec5c.png

示意图

问题展开

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

13d85c9ba6b07857b7bcc8a3252fa502.png

更新

更多人脸:

f3fff755e88e473d5f68e32a9bf9ffba.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis 属性表 汇总_Arcgis中遥感影像地理配准、矢量化与地图制作

目的:将遥感图像进行地理配准、矢量化,并且制作地图。要求:对的遥感图像进行地理配准;矢量化建筑物、绿地、道路、水体等主要地物要素;对各类地物要素进行符号化设置并对其名称进行标注;添加指北针、比例尺…

怎么查看计算机的系统内存大小,Windows10系统怎么查看电脑内存大小

很多用户在升级到windows10系统之后,因为很多界面和操作都跟之前的Windows系统不一样,所以很多操作都不知道要如何下手,比如想要查看电脑内存大小的时候却不知道要怎么操作,其实方法很简单,下面给大家介绍一下Windows1…

java类初始化顺序_《To Be a Better Javaer》-- Java 基础篇 vol.2:面向对象

Java是面向对象的高级编程语言,面向对象的特征如下:面向对象具有抽象、封装、继承、多态等特性;面向对象可以将复杂的业务逻辑简单化,增强代码复用性;面向对象是一种常见的思想,比较符合人们的思考习惯。面…

计算机开机时间停在上次关机,怎么在电脑开机的时候查看上次关机前的操作

满意答案wencai242013.09.05采纳率:51% 等级:12已帮助:12606人1.看计算机在哪天运行过~运行了多久!(系统安装在c盘)找到c:\windows\SchedLgU.txt文件 里面有你自这个系统产生以来曾经工作过的时间,包括哪天开了机 开机时间 关机…

php 递归实现无限极分类和排序_PHP实现选择排序

这次说说选择排序。 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找…

idea for循环快捷键_IDEA骚技巧,编码速度至少快一倍

IDEA是目前市场上最好用的IDE,公认的!前几年eclipse在市场上非常流行,因此大多数人都习惯了eclipse的一些快捷键。近年来,随着IDEA的兴起,很多人都放弃了exlipse,进而选择了IDEA,但是有些人习惯…

从物联网到 3D 打印:硬件相关的开源项目概览 | 开源专题 No.52

arendst/Tasmota Stars: 20.4k License: GPL-3.0 Tasmota 是一款为 ESP8266 和 ESP32 设备提供的替代固件,具有易于配置的 webUI、OTA 更新、定时器或规则驱动的自动化功能以及通过 MQTT、HTTP、串口或 KNX 进行完全本地控制。该项目主要特点包括: 支持…

计算机缺少fixos.dll,fix_toolbox.dll

我该如何安装从金山毒霸下载的DLL文件?一:1、从金山毒霸下载压缩文件。2、将DLL文件解压到电脑上的某个地方。3、把该文件跟要求使用它的程序放在同一路径上。注意32位程序需要使用32位的DLL文件,64位程序需要使用64位的DLL文件。否则会出现0…

helm安装postgres_Helm 入门介绍 Kubernetes 上的包管理软件

这篇文章介绍一下云原生应用在 Kubernetes 上安装时,经常会用到的一个重要工具,Helm。Helm 是 Kubernetes 的包管理软件。提到包管理软件,很多人都不陌生。Maven、Gradle、pip、RubyGems 和 npm 都是包管理软件。作为一个包管理软件&#xff…

flutter 分割线_Flutter 底部弹框 showModalBottomSheet 使用Demo

题记—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。Flutter是谷歌推出的最新的移动开发框架。【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过 文章底部扫码关注【x2】各种系列的视频教程 免费开源 关注 你不会迷路【x3】系…

python迭代器和for循环区别_python迭代器和for循环区别

迭代器(iterator):迭代器对象必须同时实现__iter__和__next__方法才是迭代器。对于迭代器来说,__iter__ 返回的是它自身 self,__next__ 则是返回迭代器中的下一个值,最后没有元素时,抛出异常(异常可以被开发者看到)。1.迭代器一定是可迭代对象…

python中代理模式分为几种_通俗 Python 设计模式——代理模式

今天来说一说代理模式。 代理模式顾名思义,是对资源进行代理访问的一种模式,这里的资源是泛指在程序中会使用到的数据、操作、过程、对象等等。当然,针对不同的资源,代理进行的操作不尽相同,根据前人的总结&#xff0c…

layer文件ajax上传,layer弹出层数据传输到content里面

在项目中使用layer弹出层的时候,遇到一个问题,就是利用ajax请求后台数据成功时,调用layer弹出层(iframe),如何把数据传到iframe里面去?经过百度,发现,使用js把数据拼接起来,然后在su…

清理offset_关于 kafka 日志清理策略的问题

现象:搭建了一个 kafka 服务, 使用 kafka-python 包正常生产数据, 但是 kafka 过五分钟就把我的 topic 删除掉. 但是配置 log 的已经配置了, 我认为 kafka 不应该删除我的 topic 历史数据.关于 log 清理的配置文件:############################# Log Flush Policy …

python面向对象思路_python面向对象方法

#需求:洗衣机,功能:能洗衣服#1、定义洗衣机类"""class 类名():代码"""classWasher():defwash(self):print("能洗衣服")#2 创建对象#对象名 类名()haier Washer()#3、验证成果#打印haier…

饥荒进地洞服务器无响应,饥荒联机洞穴设置及常见问题的解决方法

进阶篇服务端mod设置:首先(1)下载好要用mod,然后下载通用工具,解压放到DST的mod文件夹里运行(2)此时在文档\Klei\DoNotStarveTogether会多出一个文件modoverrides,把它复制到文档\klei\DoNotStarveTogether_EasyConfigCaves&#…

roads 构筑极致用户体验_万物互联大势所趋 华为保驾护航运营商“三个转型”...

随着通信技术及其应用的快速发展,人们发现物理世界和数字世界正在加速融合,数字经济正在改变和颠覆着传统市场格局。于是人们看到,电子商务、远程教育、远程医疗、物联网、大数据等等,一波接一波的商业浪潮不断涌现。然而支撑这一…

python列表字典_Python常用对字典、列表的操作

本文中使用的Python版本为3.x。合并两个列表方法一a [1, 2, 3]b [4, 5, 6]print(a b)print(a)print(b)输出结果为:[1,2,3,4,5,6][1,2,3][4,5,6]说明:“ab”后,a和b都没有变化。方法二a [1, 2, 3]b [4, 5, 6]a.extend(b)print(a)print(b)…

魔兽对战平台修改服务器数据,《魔兽争霸3》1.29补丁上线官方对战平台:平衡性大做改动...

IT之家3月1日消息 今天《魔兽争霸》官方微博宣布《魔兽争霸3》的最新补丁也就是1.29补丁已经登陆官方对战平台的PTR服务器上,想要尝鲜的用户可以前往官方对战平台进行更新和游玩。1.29补丁除了增加对于宽屏游戏的支持之外,还针对英雄单位进行平衡性的改动…

查询列名在哪张表_探索SQL-多表查询

一、表的加法(Union)1、用法:将两个表合并成一个表2、语句:select 查询结果 from 从哪张表查询 union select 查询结果 from 从哪张表查询*需保留重复行*select 查询结果 from 从哪张表查询 union all select 查询结果 from 从哪张…