我的前一篇博客:使用PaddleHub给头像添加圣诞帽已经详细介绍了如何使用paddlehub给头像添加一个圣诞帽,但之前的版本由于时间仓促还存在一些问题:

  • 圣诞帽超出头像边界程序会报错
  • 无法识别出人脸位置程序会报错

针对这两个问题我对代码进行了改进。代码的基本实现原理这里不再详解,如何实现可以参考之前的文章,完整代码参见Github。下面开始正题。

目录

  • 1.项目背景
  • 2.解决方案
  • 3.项目代码
  • 4.结果演示

1.项目背景

还记得去年圣诞节前夕在朋友圈刷屏的“微信官方,请给我一顶圣诞帽”吗?事实上无论你怎么@它都不会给你一顶圣诞帽的,这是圣诞节前夕的一个小小恶作剧。但是谁又不想在圣诞节给自己的头像换上一个圣诞帽增加一些过节的气氛呢?当打开群组打开朋友圈看到满屏的头像都是圣诞帽,即使自己正在加班也能身处圣诞节的氛围中,想想也是一件很开心的事。

现有的添加圣诞帽的方式主要有3种,如下表所示:

方法 优缺点
使用Photoshop软件添加 优点:自由创作性强,可以选择圣诞帽的样式,放置位置和大小。缺点:难度较高,需要具备PS知识
使用手机APP添加 优点:比PS容易掌握。缺点:没有针对圣诞帽的贴纸,部分软件任然需要抠图制作,APP种类繁多不知道该选用哪一个
公众号、小程序自动添加 多为营销号

我只是想给头像添加一个圣诞帽而已怎么这么麻烦T^T,有没有那种新手小白也可以用的制作圣诞帽头像的方式,并且也不用这么麻烦,找贴纸,关注公众号?当然有,针对以上这些问题,我开发了这套基于Paddlehub的一件添加圣诞帽的软件,该软件有以下优点:

  • 带有GUI界面,对用户友好;
  • 只需一键即可添加,不需要搜索贴纸,关注公众号;
  • 漫画头像也能添加

2.解决方案

本项目采用的是Paddlehub的ultra_light_fast_generic_face_detector_1mb_320人脸检测模块,该模块体积小,检测速度快,识别精度高。

解决思路:

  1. 获得人脸的关键点位置,获得圣诞帽抠图后的图像;
  2. 将圣诞帽放置在人脸关键点位置正上方,合成用到的方法是掩膜;
  3. 如果圣诞帽超过头像边界有两种解决方案:(1)裁剪掉圣诞帽超出的区域;(2)缩小圣诞帽直到不超出区域为止。圣诞帽形状特殊,如果裁剪过多可能无法判断所属类别,因此选择方案(2),并且实现也更为简单;
  4. 如果无法识别出人物头像应该终止程序并向用户提示更换照片;
  5. 如果识别出人物头像,显示添加完制作完成的头像,并向用户提示新头像保存位置;
  6. GUI界面用户可以选择任意路径下头像图片

流程图:

3.项目代码

环境配置:

  • python 3.6
  • paddlehub 1.7.1
  • PIL 7.1.2
    *注:该代码无法在notebook运行
import paddlehub as hub
import tkinter as tk
from PIL import ImageTk,Image
from tkinter import filedialog
import os
import cv2# 添加圣诞帽
def add_hat(img_path, hat_path):# 加载人脸识别模型,取出关键点坐标model = hub.Module(name='ultra_light_fast_generic_face_detector_1mb_320')input_dict = {'image': [img_path]}results = model.face_detection(data=input_dict, visualization=True)for result in results:try:left, right, top, bottom = int(result['data'][0]['left']), int(result['data'][0]['right']),\int(result['data'][0]['top']), int(result['data'][0]['bottom']) # 对帽子进行缩放hat=cv2.imread(hat_path)hat_h, hat_w, _ = hat.shapeface_w = right - leftratio = face_w/hat_wresized_hat_h = int(round(hat_h*ratio))resized_hat_w = int(round(hat_w*ratio))resized_hat = cv2.resize(hat,(resized_hat_w,resized_hat_h))# 判断ROI是否超出边界while top-resized_hat_h<0:resized_hat = cv2.resize(resized_hat,(int(resized_hat_w*0.9),int(resized_hat_h*0.9)))resized_hat_h = resized_hat.shape[0]resized_hat_w = resized_hat.shape[1]# 读取人物照片person = cv2.imread(img_path)# 制作掩膜hat2gray = cv2.cvtColor(resized_hat, cv2.COLOR_BGR2GRAY)  # 转换为灰度图像ret, mask = cv2.threshold(hat2gray, 249, 255, cv2.THRESH_BINARY)  # 设置阈值,大于175的置为255,小于175的置为0mask_inv = cv2.bitwise_not(mask)# 掩膜mid_axis = int((right+left)/2)half_wide = int(resized_hat_w/2)roi = person[(top-resized_hat_h):top, (mid_axis-half_wide):(mid_axis-half_wide+resized_hat_w)]person_bg = cv2.bitwise_and(roi, roi, mask=mask)  #删除了ROI中的logo区域hat_fg = cv2.bitwise_and(resized_hat, resized_hat, mask=mask_inv) #删除了logo中的空白区域dst = cv2.add(person_bg, hat_fg)person[(top-resized_hat_h):top, (mid_axis-half_wide):(mid_axis-half_wide+resized_hat_w)] = dst # 保存头像profile_path = 'your_profile_photo/'+os.path.basename(img_path)cv2.imwrite(profile_path, person)except:profile_path = Nonereturn profile_pathdef resize_image(img):w,h = img.sizemlength = max(w,h)ratio = 500/mlengthw_new = int(w*ratio)h_new = int(h*ratio)re_img = img.resize((w_new,h_new))return re_imgdef gui():global imageimg_path = filedialog.askopenfilename() #获取文件路径hat_path = 'hat.jpg'profile_path = add_hat(img_path, hat_path)if profile_path is not None:img = Image.open(profile_path)re_img = resize_image(img)image = ImageTk.PhotoImage(re_img)canvas.create_image(260,260,anchor='center', image=image)  tk.messagebox.showinfo(title='Info', message='New profile photo has generated, please find it at the file: your_profile_photo')else:tk.messagebox.showwarning(title='Warning', message='Cant recognize your profile photo, please change a new one')root = tk.Tk()
root.title('给你一顶圣诞帽')
root.geometry('600x600')
canvas=tk.Canvas(root,height=500,width=500)
canvas.pack()
b = tk.Button(root,text='Select your profile photo', command=gui)  #设置按钮,并给它openpicture命令
b.pack()
root.mainloop()

4.结果演示

  • 运行程序会弹出GUI界面,用户点击’Select your profile photo’选择图片存放位置
  • 选择你想添加的头像
  • 显示添加圣诞帽后的头像,并提示用户在’your_frofile_photo’文件夹获取新生成的头像,非常抽象的头像也能识别
  • 如果无法识别头像中的脸,则提示用户换一张头像重试
    项目地址:
    使用paddlehub给你的头像一键添加圣诞帽GUI版

使用paddlehub给头像添加圣诞帽(GUI版)相关推荐

  1. python自动给头像添加圣诞帽

    通知:今年的圣诞节推迟到2021年1月8日,因为圣诞老人到了之后还要被隔离14天. 马上就要圣诞节了,大家想好送什么礼物给自己对象了吗? 因为疫情原因,圣诞老人不能来中国给我们送礼物了,所以今年由我来 ...

  2. 微信官方都辟谣,可真有技术人用 AI、大数据实现头像添加圣诞帽了!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 从昨天到现在,朋友圈里便持续性地见到了许多"请给我一顶圣诞帽@微信官方" ...

  3. 在线工具给头像添加圣诞帽html源码

    最近马上圣诞节也要来临,跟一波风,弄了一个关于在线制作圣诞帽的小程序,感兴趣的朋友可以去尝试一下哦~ <!DOCTYPE html> <html> <head>&l ...

  4. 圣诞节,教你用Python给微信头像添加一个圣诞帽!

    作者:刘早起 来源:早起Python 圣诞节快到了,每年一到圣诞节就会有很多人的头像上多了一顶小红帽 那么你有想过如何用Python去实现吗? 如果你尝试去搜索,会发现网上教程一大堆,但是由于大多数人 ...

  5. 不用P图!用Python给头像加圣诞帽并制作成可执行软件!

    文 | 闲欢 来源:Python 技术「ID: pythonall」 随着圣诞节的到来,节日气氛也越来越浓厚.大街上随处可见挂满饰品的圣诞树,好多小伙伴的头上也多了一顶红色牛角的圣诞帽. 往年在这个时 ...

  6. python画圣诞帽_用Python给头像加上圣诞帽

    原标题:用Python给头像加上圣诞帽 随着圣诞的到来,大家纷纷@官微给自己的头像加上一顶圣诞帽.我们有必要写一个程序来做这件事情. 用到的工具 OpenCV dlib 流程 一.素材准备 首先我们需 ...

  7. 用Python给头像加上圣诞帽或圣诞老人小徽章

    随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章: https://zhuanlan.zh ...

  8. 用Python给头像加上圣诞帽

    正文共3743个字,9张图,预计阅读时间22分钟. 01 引言 随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽.当然这种事情用很多P图软件都可以做到.但是作为一个学习图像处理的技术人,还 ...

  9. 超简单 Python 头像戴圣诞帽教程

    还记得疫情之初,我们用Python给头像戴口罩的文章吗? 开工第一天,先用Python戴个口罩 当时只是简单的调用了第三方模块将口罩图片替换入原图,内容非常简短. 今天,将为大家提供一个能够通过以下三 ...

最新文章

  1. 和12岁小同志搞创客开发:手撕代码,做一款遥控灯
  2. [Swift]LeetCode45. 跳跃游戏 II | Jump Game II
  3. Shell基础之条件判断 分支判断
  4. beta:scrum5
  5. Spring AOP之HelloWorld与概念介绍(xml版)
  6. 16.What is pass in Python?
  7. hp 服务器可以安装win7系统安装失败,如何解决win7hp1213打印机安装失败的问题
  8. zTree动态添加节点
  9. cad快捷栏怎么调出来_cad工具栏怎么调出来
  10. 社交网络分析-中心性指标
  11. 什么是数字式射频信号发生器
  12. 第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也
  13. Android JetPack Security简介
  14. sqlserver查询时间范围
  15. String类型转Long类型
  16. 拨号服务器是什么,有什么用处?
  17. 国内外主要射频器件厂商介绍
  18. 语音分离speech separation数据准备,开源
  19. 中级篇——树莓派系统备份恢复的两种方式
  20. oracle11g 清除缓存,Oracle11g结果集缓存限制

热门文章

  1. PHP之冒泡排序的优化
  2. ajax提交form表单到数据库(无刷新)
  3. 暗影精灵6p 屏幕亮度无法调节(ubuntu20.04)
  4. 电脑常识-远程桌面显示鼠标
  5. api工厂小程序好物圈插件使用教程
  6. 高通驱动实现 GPIO 中断上报键值
  7. 如何创建vue脚手架
  8. SAP-S4HANA BP 业务伙伴(客户与供应商)管理后台配置
  9. HyperWorks学习笔记(一)
  10. [练习] 微信朋友圈点赞 -测试用例的编写