头像识别 头像识别


头像识别 头像识别


作者: 派森酱
来源:Python 技术
随着圣诞节的到来,节日气氛也越来越浓厚 。大街上随处可见挂满饰品的圣诞树,好多小伙伴的头上也多了一顶红色牛角的圣诞帽 。
往年在这个时候,好多 P图软件 会推出给头像加一顶圣诞帽的功能,甚至有一年大伙 @微信官方 就可以在自己的微信头像上加一顶圣诞帽 。
作为一个学习 Python 的技术人,自己可以写程序实现这个功能,做成一个软件当然是一件很酷的事情了 。
今天就给大家分享一下如何用 Python 制作一款自动给头像添加圣诞帽的软件 。
如果不想看实现,可以直接跳到文末获取软件 。
思路
我们的 头像添加圣诞帽软件 制作的大致思路如下:
要实现一个软件,我们需要制作一个 GUI 界面,供用户操作 。要实现头像戴圣诞帽功能,我们需要用户上传一张头像,我们还需要准备一顶圣诞帽子图片 。要把圣诞帽戴在头像上,我们需要识别头像中的人脸和头部特征,然后将帽子放在头顶合成一张图片 。
基于以上思路,我们制作这款软件的关键词有:
GUI 界面圣诞帽图片头像图片人脸识别打包软件实现
看了以上思路,相信大家脑海中已经对这个软件制作的过程有了一个大致的框架了 。我们的实现主要分为:图像制作、GUI界面、打包三大块内容 。
准备工作
首先列举一下本次软件制作过程中需要用的的一些包模块:
cv2
pip install opencv-python
os
python 系统模块
dlib
pip install dlib
【头像识别 头像识别】numpy
pip install pandas
PySimpleGUI
pip install PySimpleGui
温馨提示:这其中安装 dlib 会遇到很多坑以及很多困难,一般需要一边安装一边上网搜索报错,从而找到解决办法 。保证安装过一次之后不想尝试第二次 。
图像制作准备圣诞帽
我们需要准备一个圣诞帽的图片,格式最好为 png,因为 png 图片我们可以直接用 Alpha通道 作为掩膜使用 。如果是 jpg 图片,需要先转换成 png 格式图片 。注意这里的转换不是只改个后缀名,那样是行不通的 。
我们用到的圣诞帽如下图:
为了能够与 RGB 通道的头像图片进行运算,我们需要把圣诞帽图像分离成 RGB 通道图像和 alpha通道图像:
r,g,b,a = cv2.split(hat_img)
rgb_hat = cv2.merge((r,g,b))
cv2.imwrite("hat_alpha.jpg",a)
分离之后,得到的 alpha通道图像如下所示:
人脸识别
我从我的百宝箱中选择了一张傻萌傻萌的图片作为程序的测试图片 。
大家注意,因为我们要做人脸识别,然后自动添加帽子,所以选择的图片一定要是真人的正面照片,不然识别不了人脸,也就不知道在哪添加圣诞帽 。
下面我们用 dlib 的正脸检测器进行人脸检测,用 dlib 提供的模型提取人脸的五个关键点 。代码如下:
# dlib人脸关键点检测器
predictor_path = "shape_predictor_5_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)
# dlib正脸检测器
detector = dlib.get_frontal_face_detector()
# 正脸检测
dets = detector(img, 1)
# 如果检测到人脸
if len(dets)>0:
for d in dets:
x,y,w,h = d.left(),d.top(), d.right()-d.left(), d.bottom()-d.top()
# x,y,w,h = faceRect
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2,8,0)
# 关键点检测,5个关键点
shape = predictor(img, d)
for point in shape.parts():
cv2.circle(img,(point.x,point.y),3,color=(0,255,0))
cv2.imshow("image",img)

推荐阅读