社区 文章详情

用Python给头像加上圣诞帽

类别标签 技术博客

2419 阅读 15 赞 发表于 2017-12-25
“本文用人脸检测及人脸关键点检测等算法,实现了最近红遍微信圈的头像加圣诞帽~”

原文:用Python给头像加上圣诞帽 (授权转载)
作者:冰不

引言

随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情。而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思。

用到的工具

  • OpenCV(毕竟我们主要的内容就是OpenCV...)
  • dlib(前一篇文章刚说过,dlib的人脸检测比OpenCV更好用,而且dlib有OpenCV没有的关键点检测。)

用到的语言为Python。但是完全可以改成C++版本,时间有限,就不写了。有兴趣的小伙伴可以拿来练手。

流程

一、素材准备

首先我们需要准备一个圣诞帽的素材,格式最好为PNG,因为PNG的话我们可以直接用Alpha通道作为掩膜使用。我们用到的圣诞帽如下图:


我们通过通道分离可以得到圣诞帽图像的alpha通道。代码如下:

r,g,b,a = cv2.split(hat_img) rgb_hat = cv2.merge((r,g,b))cv2.imwrite("hat_alpha.jpg",a)

为了能够与rgb通道的头像图片进行运算,我们把rgb三通道合成一张rgb的彩色帽子图。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)cv2.waitKey()  

这部分效果如下图:


三、调整帽子大小

我们选取两个眼角的点,求中心作为放置帽子的x方向的参考坐标,y方向的坐标用人脸框上线的y坐标表示。然后我们根据人脸检测得到的人脸的大小调整帽子的大小,使得帽子大小合适。

           # 选取左右眼眼角的点point1 = shape.part(0)point2 = shape.part(2)# 求两点中心eyes_center = ((point1.x+point2.x)//2,(point1.y+point2.y)//2)# cv2.circle(img,eyes_center,3,color=(0,255,0))  # cv2.imshow("image",img)# cv2.waitKey()#  根据人脸大小调整帽子大小factor = 1.5resized_hat_h = int(round(rgb_hat.shape[0]*w/rgb_hat.shape[1]*factor))resized_hat_w = int(round(rgb_hat.shape[1]*w/rgb_hat.shape[1]*factor))if resized_hat_h > y:resized_hat_h = y-1# 根据人脸大小调整帽子大小resized_hat = cv2.resize(rgb_hat,(resized_hat_w,resized_hat_h))

四、提取帽子和需要添加帽子的区域

按照之前所述,去Alpha通道作为mask。并求反。这两个mask一个用于把帽子图中的帽子区域取出来,一个用于把人物图中需要填帽子的区域空出来。后面你将会看到。

           # 用alpha通道作为maskmask = cv2.resize(a,(resized_hat_w,resized_hat_h))mask_inv =  cv2.bitwise_not(mask)

从原图中取出需要添加帽子的区域,这里我们用的是位运算操作。

           # 帽子相对与人脸框上线的偏移量dh = 0dw = 0# 原图ROI# bg_roi = img[y+dh-resized_hat_h:y+dh, x+dw:x+dw+resized_hat_w]bg_roi = img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)]# 原图ROI中提取放帽子的区域bg_roi = bg_roi.astype(float)mask_inv = cv2.merge((mask_inv,mask_inv,mask_inv))alpha = mask_inv.astype(float)/255# 相乘之前保证两者大小一致(可能会由于四舍五入原因不一致)alpha = cv2.resize(alpha,(bg_roi.shape[1],bg_roi.shape[0]))# print("alpha size: ",alpha.shape)# print("bg_roi size: ",bg_roi.shape)bg = cv2.multiply(alpha, bg_roi)bg = bg.astype('uint8')

这是的背景区域(bg)如下图所示。可以看到,刚好是需要填充帽子的区域缺失了。


然后我们提取帽子区域。

           # 提取帽子区域hat = cv2.bitwise_and(resized_hat,resized_hat,mask = mask)

提取得到的帽子区域如下图。帽子区域正好与上一个背景区域互补。


五、添加圣诞帽

最后我们把两个区域相加。再放回到原图中去,就可以得到我们想要的圣诞帽图了。这里需要注意的就是,相加之前resize一下保证两者大小一致,因为可能会由于四舍五入原因不一致。

           # 相加之前保证两者大小一致(可能会由于四舍五入原因不一致)hat = cv2.resize(hat,(bg_roi.shape[1],bg_roi.shape[0]))# 两个ROI区域相加add_hat = cv2.add(bg,hat)# cv2.imshow("add_hat",add_hat) # 把添加好帽子的区域放回原图img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)] = add_hat

最后我们得到的效果图如下所示。

PS.
圣诞帽源码:https://github.com/LiuXiaolong19920720/Add-Christmas-Hat
*推荐文章*

Facebook面部识别新突破:可识别未标记照片中用户

ICCV 2017 论文解读集锦


点击加入极市Email List ,获取极市最新项目需求,以及前沿视觉资讯等。

附件

(登陆后可下载)

15

用python给头像加圣诞帽相关推荐

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

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

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

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

  3. python画圣诞帽_用Python给头像加上圣诞帽或圣诞老人小图标

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

  4. python画圣诞帽_使用Python给头像加上圣诞帽或圣诞老人小图标附源码

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

  5. 用Python给头像加上圣诞帽或圣诞老人小图标

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

  6. 圣诞老人python代码_用Python给头像加上圣诞帽或圣诞老人小徽章

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

  7. python画圣诞老人_使用Python给头像加上圣诞帽或圣诞老人小图标附源码

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

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

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

  9. 圣诞节首发:给头像加圣诞帽小工具!

    最近看到小伙伴问我,马上要到圣诞节了,怎么给微信头像加圣诞帽,其实方法非常的简单,先来看一下我设置好的效果吧! 这里面的帽子样式非常多,有10多种样式可以选择,比如红色圣诞帽.绿色圣诞帽等等,下面给小 ...

最新文章

  1. 【数据库】mysql 常用命令(一)
  2. 《未来企业效率白皮书》
  3. Visual Studio的一些快捷键(转载)
  4. Ubuntu12.04设置软件源
  5. __int64 与long long 的区别
  6. dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半
  7. 计算机实现数论 奇偶排列问题
  8. ArcGIS Pro快速汉化方法-汉化GP
  9. 第二篇:浅谈自定义头文件可能导致的重定义问题
  10. SpeedTree学习笔记(转)
  11. 谷歌翻译失败解决方案
  12. 【程序设计入门-C语言】翁凯——初学者视角1
  13. Generalized Focal Loss
  14. qq空间小尾巴怎么修改
  15. 植物识别小系统:“ 花草树木 皆有名“一热爱自然,从认识自然开始 ~
  16. 手机打不开html,如何解决手机浏览器打不开网页的问题,原来是这样的
  17. 安慰奶牛 问题描述 Farmer John变得非常懒,他不想再继续维
  18. UART串口流控制(Flow control)
  19. 图像金字塔LK光流法原理分析
  20. java-net-php-python-ssm二级学院学生会人事管理信息系统计算机毕业设计程序

热门文章

  1. Python pyecharts 绘制的交通拥堵情况地图
  2. 【Android】android TV开发
  3. 微信发照片会保存到服务器吗,微信拍摄的照片存放到什么路径 微信拍摄照片的保存路径介绍...
  4. 关于Android百度地图API步骑行导航引擎初始化失败以及View空指针异常的问题
  5. cad无法安装_你的软件下载好了,为什么安装不上?有两个原因,解决方法在这...
  6. HTTP权威指南 - Web机器人
  7. 剑指offer 代码实现 C++
  8. 安全开发基础 -- DAST,SAST,IAST简单介绍
  9. 第五阶段-第五阶段高性能分布式缓存Redis
  10. 实时 Linux 架构剖析