“
每年到这个时候,微信好友的头像都会开始换上「圣诞」皮肤。最常见的就是加个圣诞小帽子了。
当然这种事情用很多 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
领取专属 10元无门槛券
私享最新 技术干货