天天看點

@微信官方給不了的聖誕帽,Python和OpenCV給你(附代碼)

用到的工具

OpenCV(畢竟我們主要的内容就是OpenCV...)

dlib(前一篇文章剛說過,dlib的人臉檢測比OpenCV更好用,而且dlib有OpenCV沒有的關鍵點檢測。)

用到的語言為Python。但是完全可以改成C++版本,時間有限,就不寫了。有興趣的小夥伴可以拿來練手。

流程

一、素材準備

首先我們需要準備一個聖誕帽的素材,格式最好為PNG,因為PNG的話我們可以直接用Alpha通道作為掩膜使用。我們用到的聖誕帽如下圖:

@微信官方給不了的聖誕帽,Python和OpenCV給你(附代碼)

我們通過通道分離可以得到聖誕帽圖像的alpha通道。代碼如下:

為了能夠與rgb通道的頭像圖檔進行運算,我們把rgb三通道合成一張rgb的彩色帽子圖。Alpha通道的圖像如下圖所示。

@微信官方給不了的聖誕帽,Python和OpenCV給你(附代碼)

二、人臉檢測與人臉關鍵點檢測

我們用下面這張圖作為我們的測試圖檔。

@微信官方給不了的聖誕帽,Python和OpenCV給你(附代碼)

下面我們用dlib的正臉檢測器進行人臉檢測,用dlib提供的模型提取人臉的五個關鍵點。代碼如下:

這部分效果如下圖:

@微信官方給不了的聖誕帽,Python和OpenCV給你(附代碼)

我們選取兩個眼角的點,求中心作為放置帽子的x方向的參考坐标,y方向的坐标用人臉框上線的y坐标表示。然後我們根據人臉檢測得到的人臉的大小調整帽子的大小,使得帽子大小合适。

按照之前所述,去Alpha通道作為mask。并求反。這兩個mask一個用于把帽子圖中的帽子區域取出來,一個用于把人物圖中需要填帽子的區域空出來。後面你将會看到。

這是的背景區域(bg)如下圖所示。可以看到,剛好是需要填充帽子的區域缺失了。

@微信官方給不了的聖誕帽,Python和OpenCV給你(附代碼)

然後我們提取帽子區域。

提取得到的帽子區域如下圖。帽子區域正好與上一個背景區域互補。

@微信官方給不了的聖誕帽,Python和OpenCV給你(附代碼)

最後我們把兩個區域相加。再放回到原圖中去,就可以得到我們想要的聖誕帽圖了。這裡需要注意的就是,相加之前resize一下保證兩者大小一緻,因為可能會由于四舍五入原因不一緻。

最後我們得到的效果圖如下所示。

@微信官方給不了的聖誕帽,Python和OpenCV給你(附代碼)

祝大家聖誕快樂,如同大家說的那樣,多年前轉發QQ資訊就可以獲得QQ會員,到現在轉發朋友圈@微信官方,上當的依然是那一群人。也許,我們隻是願意的相信這個美好的故事而已。願多年以後,歸來依是少年。

完整代碼的Github位址:

https://github.com/LiuXiaolong19920720/Add-Christmas-Hat

原文釋出時間為:2017-12-24