pil python 安裝_20行Python代碼給微信頭像戴帽子

作者 | Leauky,北理工碩士在讀,非CS專業的Python愛好者。

朋友圈里@微信官方要求戴圣誕帽的活動曾經火爆一時,有些會玩的小伙伴都悄咪咪地用美圖秀秀一類的 app 給自己頭像 p 一頂,然后可高興地表示“哎呀好神奇hhhh”,呆萌的小伙伴當然就一直等啊等... ...作為一名堅信“用技術解決需求”的萌新,在一個無聊的周末嘗試用python來搞一波事情。

主要思路

準備兩張圖:一張頭像,一張帽子。先用人臉識別定位頭像中的人臉,給出人臉像素坐標;再根據這個坐標確定帽子放置的坐標;最后將兩張圖片拼接后輸出。(需要注意的是,帽子是不規則圖像,除了主體外背景應該是透明的,因此必須是四通道png格式)。gakki 醬親自演示如下:

3746fd85be56984f260a2d2acd46ec5c.png

示意圖

問題展開

1. 人臉識別怎么搞定?(重新造輪子?不存在的,這輩子都不可能造輪子的)。Github上一個開源的python人臉識別庫face_recognition雙手奉

https://github.com/ageitgey/face_recognition#face-recognition

據說識別率99.38%(頂瓜瓜啊!)。通過安裝這個庫就可以調用人臉檢測器。

2. 確定了帽子的放置位置,怎么拼接圖層?這個屬于基本的圖像操作,python提供了PIL(Python Image Lib)這么一個庫來進行圖像處理,具體操作請看后面的代碼。

庫的安裝

我的環境是Ubuntu 16.04+Python2.7.12。使用Window,Mac OS和Python3的同學也可以參考,都是類似的。face_recognition這個庫比較事兒,安裝前需要依次安裝boost(boost_python),cmake,dlib這幾個依賴和庫,中間出現任何問題都可以通過Google解決(懶得寫 -.. -)。安裝完所有的依賴后,使用命令:

1pip install face_recognition2pip install pillow #PIL庫

完成后就可以在你的python腳本里import face_recognition和PIL了。

代碼分析

Talk is cheap, show me the code。直接上代碼:

1from PIL import Image2import face_recognition3img_path = raw_input("image path:")4image = face_recognition.load_image_file(img_path)5face_locations = face_recognition.face_locations(image)6print("Found {} face(s) in this photograph.".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行讀入帽子圖像并做相同處理。

11for face_location in face_locations:12 top, right, bottom, left = face_location13 top -= 1014 print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))15 head_h = bottom-top#hight of head16 head_l = right-left#length of head17 hat_img = hat_img.resize( (head_l,head_h) )#convert size of hat18 hat_region = hat_img19 human_region = ( left, top-head_h, right, top )20 human_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行,完成輸出~

13d85c9ba6b07857b7bcc8a3252fa502.png

更新

更多人臉:

f3fff755e88e473d5f68e32a9bf9ffba.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532125.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532125.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532125.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

arcgis 屬性表 匯總_Arcgis中遙感影像地理配準、矢量化與地圖制作

目的:將遙感圖像進行地理配準、矢量化,并且制作地圖。要求:對的遙感圖像進行地理配準;矢量化建筑物、綠地、道路、水體等主要地物要素;對各類地物要素進行符號化設置并對其名稱進行標注;添加指北針、比例尺…

怎么查看計算機的系統內存大小,Windows10系統怎么查看電腦內存大小

很多用戶在升級到windows10系統之后,因為很多界面和操作都跟之前的Windows系統不一樣,所以很多操作都不知道要如何下手,比如想要查看電腦內存大小的時候卻不知道要怎么操作,其實方法很簡單,下面給大家介紹一下Windows1…

java類初始化順序_《To Be a Better Javaer》-- Java 基礎篇 vol.2:面向對象

Java是面向對象的高級編程語言,面向對象的特征如下:面向對象具有抽象、封裝、繼承、多態等特性;面向對象可以將復雜的業務邏輯簡單化,增強代碼復用性;面向對象是一種常見的思想,比較符合人們的思考習慣。面…

計算機開機時間停在上次關機,怎么在電腦開機的時候查看上次關機前的操作

滿意答案wencai242013.09.05采納率:51% 等級:12已幫助:12606人1.看計算機在哪天運行過~運行了多久!(系統安裝在c盤)找到c:\windows\SchedLgU.txt文件 里面有你自這個系統產生以來曾經工作過的時間,包括哪天開了機 開機時間 關機…

php 遞歸實現無限極分類和排序_PHP實現選擇排序

這次說說選擇排序。 選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找…

idea for循環快捷鍵_IDEA騷技巧,編碼速度至少快一倍

IDEA是目前市場上最好用的IDE,公認的!前幾年eclipse在市場上非常流行,因此大多數人都習慣了eclipse的一些快捷鍵。近年來,隨著IDEA的興起,很多人都放棄了exlipse,進而選擇了IDEA,但是有些人習慣…

從物聯網到 3D 打印:硬件相關的開源項目概覽 | 開源專題 No.52

arendst/Tasmota Stars: 20.4k License: GPL-3.0 Tasmota 是一款為 ESP8266 和 ESP32 設備提供的替代固件,具有易于配置的 webUI、OTA 更新、定時器或規則驅動的自動化功能以及通過 MQTT、HTTP、串口或 KNX 進行完全本地控制。該項目主要特點包括: 支持…

計算機缺少fixos.dll,fix_toolbox.dll

我該如何安裝從金山毒霸下載的DLL文件?一:1、從金山毒霸下載壓縮文件。2、將DLL文件解壓到電腦上的某個地方。3、把該文件跟要求使用它的程序放在同一路徑上。注意32位程序需要使用32位的DLL文件,64位程序需要使用64位的DLL文件。否則會出現0…

helm安裝postgres_Helm 入門介紹 Kubernetes 上的包管理軟件

這篇文章介紹一下云原生應用在 Kubernetes 上安裝時,經常會用到的一個重要工具,Helm。Helm 是 Kubernetes 的包管理軟件。提到包管理軟件,很多人都不陌生。Maven、Gradle、pip、RubyGems 和 npm 都是包管理軟件。作為一個包管理軟件&#xff…

flutter 分割線_Flutter 底部彈框 showModalBottomSheet 使用Demo

題記—— 執劍天涯,從你的點滴積累開始,所及之處,必精益求精。Flutter是谷歌推出的最新的移動開發框架。【x1】微信公眾號的每日提醒 隨時隨記 每日積累 隨心而過 文章底部掃碼關注【x2】各種系列的視頻教程 免費開源 關注 你不會迷路【x3】系…

python迭代器和for循環區別_python迭代器和for循環區別

迭代器(iterator):迭代器對象必須同時實現__iter__和__next__方法才是迭代器。對于迭代器來說,__iter__ 返回的是它自身 self,__next__ 則是返回迭代器中的下一個值,最后沒有元素時,拋出異常(異常可以被開發者看到)。1.迭代器一定是可迭代對象…

python中代理模式分為幾種_通俗 Python 設計模式——代理模式

今天來說一說代理模式。 代理模式顧名思義,是對資源進行代理訪問的一種模式,這里的資源是泛指在程序中會使用到的數據、操作、過程、對象等等。當然,針對不同的資源,代理進行的操作不盡相同,根據前人的總結&#xff0c…

layer文件ajax上傳,layer彈出層數據傳輸到content里面

在項目中使用layer彈出層的時候,遇到一個問題,就是利用ajax請求后臺數據成功時,調用layer彈出層(iframe),如何把數據傳到iframe里面去?經過百度,發現,使用js把數據拼接起來,然后在su…

清理offset_關于 kafka 日志清理策略的問題

現象:搭建了一個 kafka 服務, 使用 kafka-python 包正常生產數據, 但是 kafka 過五分鐘就把我的 topic 刪除掉. 但是配置 log 的已經配置了, 我認為 kafka 不應該刪除我的 topic 歷史數據.關于 log 清理的配置文件:############################# Log Flush Policy …

python面向對象思路_python面向對象方法

#需求:洗衣機,功能:能洗衣服#1、定義洗衣機類"""class 類名():代碼"""classWasher():defwash(self):print("能洗衣服")#2 創建對象#對象名 類名()haier Washer()#3、驗證成果#打印haier…

饑荒進地洞服務器無響應,饑荒聯機洞穴設置及常見問題的解決方法

進階篇服務端mod設置:首先(1)下載好要用mod,然后下載通用工具,解壓放到DST的mod文件夾里運行(2)此時在文檔\Klei\DoNotStarveTogether會多出一個文件modoverrides,把它復制到文檔\klei\DoNotStarveTogether_EasyConfigCaves&#…

roads 構筑極致用戶體驗_萬物互聯大勢所趨 華為保駕護航運營商“三個轉型”...

隨著通信技術及其應用的快速發展,人們發現物理世界和數字世界正在加速融合,數字經濟正在改變和顛覆著傳統市場格局。于是人們看到,電子商務、遠程教育、遠程醫療、物聯網、大數據等等,一波接一波的商業浪潮不斷涌現。然而支撐這一…

python列表字典_Python常用對字典、列表的操作

本文中使用的Python版本為3.x。合并兩個列表方法一a [1, 2, 3]b [4, 5, 6]print(a b)print(a)print(b)輸出結果為:[1,2,3,4,5,6][1,2,3][4,5,6]說明:“ab”后,a和b都沒有變化。方法二a [1, 2, 3]b [4, 5, 6]a.extend(b)print(a)print(b)…

魔獸對戰平臺修改服務器數據,《魔獸爭霸3》1.29補丁上線官方對戰平臺:平衡性大做改動...

IT之家3月1日消息 今天《魔獸爭霸》官方微博宣布《魔獸爭霸3》的最新補丁也就是1.29補丁已經登陸官方對戰平臺的PTR服務器上,想要嘗鮮的用戶可以前往官方對戰平臺進行更新和游玩。1.29補丁除了增加對于寬屏游戲的支持之外,還針對英雄單位進行平衡性的改動…

查詢列名在哪張表_探索SQL-多表查詢

一、表的加法(Union)1、用法:將兩個表合并成一個表2、語句:select 查詢結果 from 從哪張表查詢 union select 查詢結果 from 從哪張表查詢*需保留重復行*select 查詢結果 from 從哪張表查詢 union all select 查詢結果 from 從哪張…