朋友圈里@微信官方要求戴圣誕帽的活動曾經火爆一時,有些會玩的小伙伴都悄咪咪地用美圖秀秀一類的 app 給自己頭像 p 一頂,然后可高興地表示“哎呀好神奇hhhh”,呆萌的小伙伴當然就一直等啊等... ...作為一名堅信“用技術解決需求”的萌新,在一個無聊的周末嘗試用python來搞一波事情。
主要思路
準備兩張圖:一張頭像,一張帽子。先用人臉識別定位頭像中的人臉,給出人臉像素坐標;再根據這個坐標確定帽子放置的坐標;最后將兩張圖片拼接后輸出。(需要注意的是,帽子是不規則圖像,除了主體外背景應該是透明的,因此必須是四通道png格式)。gakki 醬親自演示如下:
示意圖
問題展開
1. 人臉識別怎么搞定?(重新造輪子?不存在的,這輩子都不可能造輪子的)。Github上一個開源的python人臉識別庫face_recognition雙手奉
https://github.com/ageitgey/face_recognition#face-recognition
據說識別率99.38%(頂瓜瓜啊?。Mㄟ^安裝這個庫就可以調用人臉檢測器。
2. 確定了帽子的放置位置,怎么拼接圖層?這個屬于基本的圖像操作,python提供了PIL(Python Image Lib)這么一個庫來進行圖像處理,具體操作請看后面的代碼。
庫的安裝
我的環境是Ubuntu 16.04+Python2.7.12。使用Window,Mac OS和Python3的同學也可以參考,都是類似的。face_recognition這個庫比較事兒,安裝前需要依次安裝boost(boost_python),cmake,dlib這幾個依賴和庫,中間出現任何問題都可以通過Google解決(懶得寫 -.. -)。安裝完所有的依賴后,使用命令:
1pipinstallface_recognition2pipinstallpillow#PIL庫
完成后就可以在你的python腳本里import face_recognition和PIL了。
代碼分析
Talk is cheap, show me the code。直接上代碼:
1fromPILimportImage 2importface_recognition 3img_path=raw_input("imagepath:") 4image=face_recognition.load_image_file(img_path) 5face_locations=face_recognition.face_locations(image) 6print("Found{}face(s)inthisphotograph.".format(len(face_locations)))
第1、2行導入PIL庫中的Image模塊和face_recognition庫。第3行,等待用戶輸入頭像圖片的路徑。第4行,把路徑所指的圖像數據讀入image中。第5行,調用face_locations處理image中的圖像數據,對圖片中的人臉進行識別定位,定位后的得到的像素坐標數據放在face_locations里。第6行在shell里輸出圖片里識別到的人臉的個數。
7human_img=Image.open(img_path) 8human_img=human_img.convert("RGBA") 9hat_img=Image.open("./hat.png")10hat_img=hat_img.convert("RGBA")
第7、8行,把路徑所指的圖像數據讀入human_img中,并轉換為四通道RGBA模式。9、10行讀入帽子圖像并做相同處理。
11forface_locationinface_locations:12top,right,bottom,left=face_location13top-=1014print("AfaceislocatedatpixellocationTop:{},Left:{},Bottom:{},Right:{}".format(top,left,bottom,right))15head_h=bottom-top#hightofhead16head_l=right-left#lengthofhead17hat_img=hat_img.resize((head_l,head_h))#convertsizeofhat18hat_region=hat_img19human_region=(left,top-head_h,right,top)20human_img.paste(hat_region,human_region,mask=hat_img)21human_img.show()
如果一張圖里有多張人臉,face_recognition.face_locations(image)會返回每張人臉的位置信息,存放在一個list里。因此第11行是遍歷face_locations里的每張人臉的數據。第12行解包一個人臉像素坐標數據,得到top,right,bottom,left分別為示意圖中的y1,x2,y2,x1。第13行,為啥y1要減10個像素?
因為人臉識別得到的y1最多到你額頭的位置,所以再把這個坐標往上提一提帽子才戴得更自然。第14行輸出坐標數據方便調試。第15、16行計算人臉的高度和寬度。第17行使用resize()根據人臉的大小調整帽子的大小,因為圖像中的人臉有大有小,調整后看起來更和諧。第18行,將帽子圖像作為頂部圖層圖像。第19行,確定底部圖層(頭像圖片)被覆蓋的區域(就是帽子放置區域)。
第20行,把頂部圖層與底部圖層拼接(不太明白的看下圖)。然后一個循環結束,亦即完成圖片中一個人的戴帽操作,接著進行下個人的戴帽,直到所有人都戴上了帽子。最后21行,完成輸出~
更新
更多人臉:
-
人臉識別
+關注
關注
76文章
4012瀏覽量
81937 -
python
+關注
關注
56文章
4797瀏覽量
84727 -
GitHub
+關注
關注
3文章
471瀏覽量
16460
原文標題:20行Python代碼給微信頭像戴帽子
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論