首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

圣诞节,用Python给自己加顶“圣诞帽”

每年到这个时候,微信好友的头像都会开始换上「圣诞」皮肤。最常见的就是加个圣诞小帽子了。

当然这种事情用很多 P 图软件都可以做到,微信搜索「圣诞帽」也会有各种小程序出现,但是使用之前的验证,总会要求绑定微信等各种信息,接受各种弹幕广告,甚至还有的需要分享才可以保存图片。

那么作为程序员,有没有其他添加的办法呢?当然有!

用到的工具:

OpenCV(毕竟我们主要的内容就是 OpenCV...)

dlib(dlib 的人脸检测比 OpenCV 更好用,而且 dlib 有 OpenCV 没有的关键点检测。)

用到的语言:

Python,但是完全可以改成 C++ 版本。

素材准备

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

我们用到的圣诞帽如下图:

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

为了能够与 rgb 通道的头像图片进行运算,我们把 rgb 三通道合成一张 rgb 的彩色帽子图。

Alpha 通道的图像如下图所示:

人脸检测与人脸关键点检测

我们用下面这张图作为我们的测试图片:

下面我们用 dlib 的正脸检测器进行人脸检测,用 dlib 提供的模型提取人脸的五个关键点。

代码如下:

这部分效果如下图:

调整帽子大小

我们选取两个眼角的点,求中心作为放置帽子的 x 方向的参考坐标,y 方向的坐标用人脸框上线的 y 坐标表示。

然后我们根据人脸检测得到的人脸的大小调整帽子的大小,使得帽子大小合适。

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

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

后面你将会看到:

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

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

然后我们提取帽子区域,代码如下:

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

添加圣诞帽

最后我们把两个区域相加。再放回到原图中去,就可以得到我们想要的圣诞帽图了。

这里需要注意的就是,相加之前 resize 一下保证两者大小一致,因为可能会由于四舍五入原因不一致。

我们得到的效果图如下图所示:

最后祝大家圣诞节快乐!

作者:冰不语

编辑:陶家龙、孙淑娟

源码地址:https://github.com/LiuXiaolong19920720/Add-Christmas-Hat

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181224B158LK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券