前言
圣诞节来了,听说前两天有不少同志被一则“票圈发自己照片并@微信官方,就可收到带圣诞帽的照片”的消息骗了,在这里我就用python 的人脸识别模块写个小应用,自动给你的照片带帽。
之前看,已经有不少大神实现了这个功能,但是看下来,采用的方法不是openCV
(觉得识别准确度较低),就是dilb
(准确度可以,但代码太长),这次我使用的是前面讲过的face_recognition
,虽然这货也是基于dilb
的,但是好用啊!感受下:
环境
- Python 3.6.1
- Windows 7 64位
- PyCharm 2017.1.4
策略
库的安装
face_recognition(之前说过说过,它是基于dlib的人脸检测,比OpenCV更好用)
安装:
1
pip install face_recognition
如果安装过程中出现问题,99%都是安装依赖的库时出现了问题,这货安装依赖较多:boost(boost_python),cmake,dlib这几个依赖和库,中间出现任何问题都可以通过Google解决(回头我写篇帖子吧这个坑填上)。
PIL库
安装:
1
pip install pillow #PIL库
思路
准备两张图,一张头像,一张帽子。先face_recognition
人脸识别定位图片中的人脸,得到人脸范围坐标;再根据这个坐标确定帽子放置的坐标;最后将两张图片拼接后输出。(需要注意的是,帽子是不规则图像,除了主体外背景应该是透明的,因此必须是四通道png格式)。
代码
我的代码注释还是比较清晰的,应该基本都能看懂:
1 | from PIL import Image |
至此,我们已经通过人脸识别得到了头像图片中的face_locations
人脸数据列表,并且将头像图像数据human_img
和帽子图像数据hat_img
读入,同时得到了proportion_hat
帽子长宽比(高/宽),待后续调用。
接下来遍历每一张face_locations
:
1 | for face_location in face_locations: # 对于每张脸 |
帽子相对与人脸框上线的偏移量,帽子缩放因子factor
和 帽子穿戴轴线位置axis
是可人为调整的参数。
在这里解释下第21行偏移量offset
的计算方法:
所以
1 | offset = ( hat_w * axis ) - ( head_w * 0.5 ) |
但是,最后被覆盖的区域human_region
的输入数值必须是int
,因此所有的计算结果都要先四舍五入round()
后再int()
最后: