当前位置: 首页 > 编程日记 > 正文

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

640?wx_fmt=jpeg


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


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


主要思路


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


640?wx_fmt=jpeg

示意图


问题展开


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


640?wx_fmt=jpeg


更新

更多人脸:

640?wx_fmt=jpeg


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

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


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


公开课预告

全双工语音


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


640?wx_fmt=jpeg

推荐阅读

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

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

  • AI删库,程序员背锅?

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

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

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

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

相关文章:

2012关于钱的Tips

对于目前的我来说,死工资是唯一的财富积累手段,而且工资本身还不足够满足所有的物质和精神需求。以此为前提,对钱的来龙去脉有一个了解、把控是极其有必要的。 2011钱的规划基本为零,一年下来惊恐的发现,似乎自己没攒多…

在 Azure 中管理 Windows 虚拟机的可用性

了解如何设置和管理多个虚拟机,以确保 Azure 中 Windows 应用程序的高可用性。 也可以管理 Linux 虚拟机的可用性。 Note Azure 具有用于创建和处理资源的两个不同的部署模型:Resource Manager 和经典。 这篇文章介绍了如何使用这两种模型,但…

[日记]一个人去散步

森林里面的寂静会让每一个人都有所进步。 ——罗伯特M波西格 《禅与摩托车维修艺术》 北陵公园下午5点之后免收门票,我就在这个时间去那里散步。 说起来,我家离北陵西门走路才10几分钟的路程,可是我…

2019年人工智能行业又进入冬天了吗?

【AI科技大本营导语】过去几年,以深度学习为代表的人工智能技术取得了前所未有的高速发展,公司高薪聘请相关领域研究人员,组建人工智能研究团队,相信人工智能带来的巨大商业价值。然而,从近一年的发展态势来讲&#xf…

Vue.js slots: 为什么你需要它们?

也许你已经看过了Vue.js slots的文档。我对这个功能从“为什么你可能需要它”到“没有它我怎么可能工作”的态度转变非常快。虽然文档已经解释了它的概念,但是这里有一个关于slots怎么改进应用程序代码库的真实例子。在我看来,slots是vue最有用和最有趣的…

apache httpd server安装的一个问题

问题1: 启动bin/apachectl start的时候: 发现报错:httpd: bad user name daemon 解决方法: groupadd daemon useradd -g daemon daemon 若没有配置合适PATH常量,则可以找 /usr/sbin/groupadd&#xff0c…

telnet 如何退出

ctrl],然后再输入q就可以退出了。转载于:https://www.cnblogs.com/rethink/archive/2009/10/29/1591898.html

TensorFlow 2.0新特性解读,Keras API成核心

来源 | Google TensorFlow 团队2018 年 11 月,TensorFlow 迎来了它的 3 岁生日,我们回顾了几年来它增加的功能,进而对另一个重要里程碑 TensorFlow 2.0 感到兴奋 !TensorFlow 2.0 将专注于 简单性 和 易用性,具有以下更…

列选主元guass消去法

200701020110 07计算机 王再#include <iostream.h>#include <iomanip.h>#include <stdlib.h>void main(){ int flag1;input(); //输入方程 while(flag){ print_menu(); //打印主菜单}void print_menu(){ system("cls");cout<…

Mac 下 IDEA 启动慢的问题

转自&#xff1a; http://blog.csdn.net/KingBoyWorld/article/details/73440717 从控制台来看&#xff0c;每次都会连接本地地址(127.0.0.1)&#xff0c;问题可能就出在这里。 修改本地/etc/hosts文件&#xff0c;添加以下内容: 127.0.0.1 localhost <hostname&g…

研发投入超876亿的华为,将如何进击云+AI?

人工智能作为下一轮科技革命的关键元素&#xff0c;正在进入越来越多的行业&#xff0c;用 AI 的技术和理念去解决现在和未来的问题&#xff0c;将是企业构建竞争力的关键。在去年 10 月召开的华为全联接大会上&#xff0c;华为轮值董事长徐直军详细阐述了华为的 AI 战略&#…

Bash脚本: 根据关键字做替换

根据某个文件的关键字做替换 #!/bin/bashkvawk -F "" { if(NF2) print $1""$2 } ./zuanshi_servic_test.propertiesfor kv in ${kv[]};dokecho $kv | awk -F "" {print $1}vecho $kv | awk -F "" {print $2} | awk -F "\r" …

Git学习系列之一些常用的Git命令收录更新ing

不多说&#xff0c;直接上干货&#xff01; 前言 对于Git工具&#xff0c;有必要整理和总结一些常用实用的命令。 http://p.primeton.com/articles/53cce3a3e138236138000026 https://www.zhihu.com/question/22932048 http://blog.csdn.net/w410589502/article/details/536063…

普通域账号客户端计算无关机选项

组策略-》计算机配置-》安全设置-》本地策略-》用户权限分配-》关闭系统把DOMIAN USERS 组加进去我是在Default Domain Policy 里面加的转载于:https://blog.51cto.com/zhangjunjie/219613

罗永浩“咬定”微信不放松

作者 | 胡巍巍来源 | CSDN&#xff08;CSDNnews&#xff09;昨天&#xff0c;1月15日&#xff0c;听起来是很普通的一天。但是&#xff0c;历史上的这一天——公元8年1月15日&#xff0c;是王莽建立新朝、西汉结束的日子。2011年后的这一天&#xff0c;有一个八岁的国民社交软件…

Windows Ruby使用Mysql环境配置

windows下Ruby使用mysql时候报错&#xff1a; Incorrect MySQL client library version! This gem was compile d for 6.0.0 but the client library is 5.1.45 经过查找找到了解决方案&#xff1a; 1. 下载mysql-connector-c-noinstall-6.0.2-win32.zip http://dev.mysql.c…

Node.js与Sails~方法拦截器policies

policies sails的方法拦截器类似于.net mvc里的Filter&#xff0c;即它可以作用在controller的action上&#xff0c;在服务器响应指定action之前&#xff0c;对这个action进行拦截&#xff0c;先执行policies的策略&#xff0c;当条件通过&#xff0c;会next()它&#xff0c;继…

MySQL性能与磁盘读写的关系及优化策略

作者&#xff1a;kider出处&#xff1a;MySQLpub.com转贴请表明作者和出处并不能用于商业目的。这些天&#xff0c;对一个场地服务器慢的情况&#xff0c;进行了监控跟踪&#xff0c;也得出一些好的结论。现在记录一些过程&#xff0c;列出可以供参考的部分&#xff0c;同时有一…

今晚8点直播 | 详解微软小冰全双工语音对话技术

微软小冰第六代发布会上正式宣布上线全新的共感模型&#xff0c;同时也开始公测一种融合了文本、全双工语音与实时视觉的新感官。这项新技术可以实时预测人类即将说出的内容&#xff0c;实时生成回应&#xff0c;并控制对话节奏&#xff0c;从而使长程语音交互成为可能。而采用…

httpd.2.4虚拟主机配置测试

测试目标&#xff1a;三个虚拟主机&#xff0c;要求如下vhost1&#xff1a; phpMyAdmin, 同时提供https服务&#xff1b;vhost2: wordpress配置过程&#xff1a;一、配置vhost11、首先配置vhost1&#xff0c;先搭建私有CA在172.16.20.242上搭建私有CA&#xff1a; (1) 创建私钥…

视频批量转换为FLV的软件开发总结(1)——思想总结篇

视频批量转换为FLV的工作中&#xff0c;完全是因为项目中用到流媒体服务器管理发布视频。原始的数据可能是.mpg、.avi等格式的&#xff0c;这就需要大量的转换工作量&#xff0c;批量转换工具的需求很明显了。 原始准备使用外面的专门的视频转换软件Total Video Converter&…

https简单配置

SSL会话过程&#xff08;1&#xff09;客户端发送可供选择的加密方式&#xff0c;并向服务器请求证书&#xff08;2&#xff09;服务器端发送证书以及选定的加密方式给客户端&#xff08;3&#xff09;客户端取得证书并进行证书验证&#xff1b;如果新人给其发证书的CA&#xf…

突破电信3G宽带对网页浏览的上网限制

从上周开始用我189的手机卡插入到我的无线上网卡中就不能正常打开网页了&#xff0c;其它的IM&#xff08;如QQ、旺旺等&#xff09;都正常。ping www.sina.com.cn这些网址也是很正常的。foxmail收邮件也很正常。本来还想可能是网络比较忙或者其它的什么原因&#xff0c;但跟踪…

ClassLoader知识收集

阅读提示&#xff1a;全文认真阅读大约需要1个半小时时间&#xff0c;如果你需要在IDE中验证并理解&#xff0c;大约需要3个小时&#xff0c;如果你想自己写个类似的类加载器并调试&#xff0c;估计还需要3个小时。该知识点的掌握检测与否&#xff0c;你可以尝试其回答Java每日…

Linux下PS1设置

在测试机上每次执行命令总要用sudo -u ads开头&#xff0c;比较麻烦。索性用&#xff1a; sudo su ads 就可以直接用ads用户名进行操作了。 但是用这种方式之后&#xff0c;命令的前缀就变成了"bash-3.2$ "&#xff0c;相当不习惯&#xff0c;经过网上搜索&#xff0…

Android API 中文 (51) —— ZoomButtonsController

一、结构 public class ZoomButtonsController extends View implements View.OnTouchListener java.lang.Object android.widget.ZoomButtonsController 二、概述 ZoomButtonsController处理缩放控件的显示和隐藏并且定位其在相关父视图的位置。他也可以做为缩放控件的…

火爆GitHub的《机器学习100天》,有人把它翻译成了中文版

作者 | 红色石头转载自AI有道&#xff08;ID:redstonewill&#xff09;今天给大家介绍一个在 GitHub 上非常火的机器学习实战项目&#xff0c;叫做 100-Days-Of-ML-Code&#xff0c;中文名为《机器学习 100 天》。目前该项目已经收获了 1.7w stars 了。下面是项目地址&#xff…

新浪程序员加班改bug,竟错失77万年会大奖

作者 | 伍杏玲转载自CSDN&#xff08;CSDNnews&#xff09;好消息&#xff01;还有不到二十天就放大假&#xff01;大伙盼着过年盼着年会盼着抽中大奖&#xff01;昨天有一位新浪码农真的抽中头等奖了——2000 股新浪股票&#xff0c;价值 77 万人民币啊&#xff01;然并卵&…

Linux简单的颜色设置

通过alias&#xff0c;在~/.bashrc里配置&#xff1a; alias l.ls -d .* --colortty alias llls -l --colortty alias lsls --colortty alias vivim alias whichalias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde

第106天:Ajax中同步请求和异步请求

同步请求和异步请求的区别 1、同步是指&#xff1a;发送方发出数据后&#xff0c;等接收方发回响应以后才发下一个数据包的通讯方式。 用户填写所有信息后&#xff0c;提交给服务器&#xff0c;等待服务器的回应&#xff08;检验数据&#xff09;&#xff0c;是一次性的。信息错…