<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圣誕節(jié),教你用Python給微信頭像添加一個(gè)圣誕帽!

          共 6265字,需瀏覽 13分鐘

           ·

          2020-12-23 18:57

          大家好,我是早起。

          圣誕節(jié)快到了,每年一到圣誕節(jié)就會(huì)有很多人的頭像上多了一頂小紅帽

          那么你有想過(guò)如何用Python去實(shí)現(xiàn)嗎

          如果你嘗試去搜索,會(huì)發(fā)現(xiàn)網(wǎng)上教程一大堆,但是由于大多數(shù)人都將圣誕帽位置固定了,所以放上自己的圖片后,要不就是圣誕帽偏移了,要不就是帽子比頭還大,代碼也不知道在哪里改,無(wú)從下手。

          因此,本文將手把手教你如何用Python為你的微信頭像添加一頂圣誕帽,并結(jié)合我們之前講過(guò)PySimpleGUI,做成一個(gè)帶有GUI的小程序,先看效果:

          本次主要分為兩個(gè)部分講解:

          • opencv對(duì)頭像添加圣誕帽
          • 結(jié)合PySimpleGUI制作人性化圣誕帽添加軟件

          主要涉及的Python模塊有:

          • PIL
          • PySimpleGUI
          • cv2
          • os

          在開始之前,你需要使用pip對(duì)相關(guān)依賴庫(kù)進(jìn)行安裝

          pip?install?pillow???#這是對(duì)模塊PTL的安裝
          pip?install?opencv-python????#這是對(duì)cv2的安裝
          pip?install?os?
          pip?install?PySimpleGui


          ? 一、利用opencv對(duì)頭像處理

          本文用到的圣誕帽,是.png格式的,如下

          為了識(shí)別照片,我們需要安裝一個(gè)OpenCV的內(nèi)置人臉識(shí)別插件,安裝步驟:

          用瀏覽器打開網(wǎng)址opencv.org---進(jìn)入Releases---下載對(duì)應(yīng)版本的OpenCV(一定要記住存放這個(gè)插件的路徑!!!后面要用到

          和以前一樣,我們先看本節(jié)全部代碼,然后進(jìn)行講解?

          import?cv2
          from?PIL?import?Image
          personPath?=?'3.jpg'??#頭像
          hatPath?=?'sheng.png'??#圣誕帽
          personImg?=?cv2.imread(personPath)
          face_haar?=?cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#存放的絕對(duì)路徑
          faces?=?face_haar.detectMultiScale(personImg,?1.1,5)
          personImg?=?Image.open(personPath)
          personImg?=?personImg.convert('RGBA')
          hatImg?=?Image.open(hatPath)
          hatImg?=?hatImg.convert('RGBA')
          for?face_x,face_y,face_w,face_h?in?faces:
          ????face_x?-=?face_w-180
          ????face_y?+=?face_h-250
          ????face_w?*=?1
          ????face_h?*=?1
          ????hatImg?=?hatImg.resize((face_w,?face_h))
          ????bg?=?(face_x,?face_y?-?face_h?+?100?,?face_x?+?face_w,?face_y?+?100?)
          ????personImg.paste(hatImg,?bg,?mask?=?hatImg)#將調(diào)整好的帽子貼上去
          personImg.save('addHat.png')

          下面對(duì)代碼進(jìn)行講解。

          首先,引入兩個(gè)模塊,用cv2.imread(personPath)來(lái)讀取相對(duì)路徑下的圖片。

          cv2.imread('圖像路徑','讀取方式'):默認(rèn)為cv2.imread_color以彩色圖像模式讀取。

          cv2.CascadeClassifier('分類器的路徑'):簡(jiǎn)單來(lái)說(shuō)就是做人臉檢測(cè)的一個(gè)必備方面,專業(yè)名詞叫做級(jí)聯(lián)分類器。這個(gè)分類器到目前版本容納了Haar特征器和LBP特征分類器兩個(gè)分類器。這次我們使用常規(guī)用的Harr特征器

          Haar特征分類器就是一個(gè)xml文件,是OpenCV官方訓(xùn)練好的檢測(cè)器,它能反應(yīng)圖像的灰度變化,以像素分模塊求差值的一種特征。下面我們講講它的路徑

          在我們準(zhǔn)備工作中我們?cè)?code style="padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);font-size: 13px;">OpenCV的官網(wǎng)下載了人臉識(shí)別的插件。以安裝在D盤為例:Harr特征分類器就在我們的D:\opencv\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml

          注意:在第6行代碼中,我們調(diào)用這個(gè)特征器的路徑最好使用絕對(duì)路徑!上述代碼只是演示

          關(guān)鍵代碼就是detectMultiScale(image,scaleFactor,minNeighbors)檢驗(yàn)出圖片中的所有人臉,并以向量類型保存各個(gè)人臉的位置和大小,最后用矩形Rect類表示,該函數(shù)由分類器((也就是上述的Haar特征分類器))的對(duì)象進(jìn)行調(diào)用。

          其中參數(shù)如下:

          image是我們要做人臉檢測(cè)的圖片。

          scaleFactor表示在前后兩次相繼的掃描中,搜索窗口的比例系數(shù)。默認(rèn)為1.1即每次搜索窗口依次擴(kuò)大10%;

          minNeighbors表示構(gòu)成檢測(cè)目標(biāo)的相鄰矩形的最小個(gè)數(shù)(默認(rèn)為3個(gè))。

          而后就是我們常見(jiàn)的用Pillow模塊打開兩張圖片,不過(guò)這次的打開方式是以RGBA模式打開,即四通道模式(A指透明度)。

          最后一個(gè)for循環(huán)就是讀取用cv2解析出來(lái)的帽子faces參數(shù),這里有趣的一點(diǎn)是,cv2做人臉識(shí)別后,會(huì)在兩眼之間畫一條線,并以中間為原點(diǎn),做x和y軸建立坐標(biāo)系。最后調(diào)節(jié)Pillow解析出來(lái)的帽子x和y位置,擺到人頭上方。所有這個(gè)方法對(duì)正臉敏感,對(duì)側(cè)臉不太友好。

          personImg.save('addHat.png')表示存儲(chǔ)添加圣誕帽后的照片。

          ? 二、GUI框架整合

          現(xiàn)在我們?cè)谏弦还?jié)的基礎(chǔ)上,將圣誕帽添加與GUI框架進(jìn)行整合,還是先上代碼之后拆分講解

          import?PySimpleGUI?as?sg
          import?os.path
          sg.change_look_and_feel("BrightColors")
          file_list_column?=?[
          ????[sg.Submit('Go',tooltip='按下面的要素添加圣誕帽',size=(15,?1)),?sg.Cancel(size=(15,?1))],
          ????[
          ????????sg.Text("圖片位置"),
          ????????sg.In(size=(25,?1),?enable_events=True,?key="-FOLDER-"),
          ????????sg.FolderBrowse('瀏覽'),
          ????],
          ????[
          ????????sg.Text("帽子寬度"),
          ????????sg.In(size=(25,?1),?enable_events=True,?key="hat-w"),
          ????],
          ????[
          ????????sg.Text("帽子高度"),
          ????????sg.In(size=(25,?1),?enable_events=True,?key="hat-h"),
          ????],
          ????[
          ????????sg.Text("帽子橫移"),
          ????????sg.In(size=(25,?1),?enable_events=True,?key="hat-x"),
          ????],
          ????[
          ????????sg.Text("帽子縱移"),
          ????????sg.In(size=(25,?1),?enable_events=True,?key="hat-y"),
          ????],
          ????[
          ????????sg.Listbox(
          ????????????values=[],?enable_events=True,?size=(40,?20),?key="-FILE?LIST-"
          ????????)
          ????],
          ]
          image_viewer_column?=?[
          ????[sg.Text("從左邊圖片列表中選擇一張圖片:",size=(60,?1),key?=?"notice")],
          ????[sg.Text("左邊的四個(gè)參數(shù)調(diào)節(jié)是在上面的參數(shù)基礎(chǔ)上進(jìn)行加減乘除;其中寬度和高度調(diào)試單位為個(gè)位數(shù)(需要大于0且是整數(shù)),橫縱移動(dòng)調(diào)試單位可任意調(diào)",size=(50,?3),?key="-TOUT-")],
          ????[sg.Image(key="-IMAGE-")],
          ]
          layout?=?[
          ????[
          ????????sg.Column(file_list_column),
          ????????sg.VSeperator(),
          ????????sg.Column(image_viewer_column),
          ????]
          ]
          window?=?sg.Window("圣誕帽添加軟件",?layout)
          while?True:
          ????event,?values?=?window.read()
          ????if?event?==?"Cancel"?or?event?==?sg.WIN_CLOSED:
          ????????break
          ????if?event?==?"-FOLDER-":
          ????????folder?=?values["-FOLDER-"]
          ????????try:
          ????????????file_list?=?os.listdir(folder)
          ????????except:
          ????????????file_list?=?[]
          ????????fnames?=?[
          ????????????f
          ????????????for?f?in?file_list
          ????????????if?os.path.isfile(os.path.join(folder,?f))
          ????????????and?f.lower().endswith((".jpg",?".png"))
          ????????]
          ????????window["-FILE?LIST-"].update(fnames)
          ????elif?event?==?"-FILE?LIST-":
          ????????try:
          ????????????filename?=?os.path.join(
          ????????????????values["-FOLDER-"],?values["-FILE?LIST-"][0]
          ????????????)
          ????????????window["-TOUT-"].update(filename)

          ????????except:
          ????????????pass
          ????elif?event==?"Go"?:
          ????????personPath?=?filename
          ??'''
          ????????圣誕帽添加部分
          ????????'''

          ????????window["notice"].update()
          ????????window["-IMAGE-"].update(filename='addHat.png')
          window.close()

          代碼解析,這里強(qiáng)烈建議讀者結(jié)合GUI進(jìn)階篇中的圖片查看器講解一起看。當(dāng)然在做PySimpleGUI之前繼續(xù)嘮叨基本步驟:

          Import ? Create some widgets Create the window Create the event loop

          由于這個(gè)GUI框架是進(jìn)階篇中的圖片查看器的改進(jìn)版,對(duì)loop事件循環(huán)做了改動(dòng)和添加一些文本框,并沒(méi)有增加新的元素,鍵的使用也是和往常一樣,所以這里就不再介紹元素和鍵了,感興趣的可以回看進(jìn)階篇(元素介紹部分和鍵部分)。

          這里我們layout的擺放思路如下:一個(gè)圣誕帽添加鍵、一個(gè)退出程序鍵、4個(gè)文本框來(lái)調(diào)節(jié)圖片中的圣誕帽、一個(gè)列表箱子裝路徑下的所有圖片、一個(gè)圖片顯示框、幾條用于提示用戶的文本框。按照這個(gè)思路,我們就有了while循環(huán)上面的代碼編寫。

          接著是loop事件循環(huán):這里我們以Go鍵促發(fā)圣誕帽添加,所以我們以這個(gè)按鈕為第一個(gè)主if元素。

          在按鈕Go促發(fā)前我們需要進(jìn)行兩個(gè)判斷:

          一是文本框沒(méi)有輸入任何東西、

          二是文本框輸入的東西。如果是前者,我們直接調(diào)動(dòng)添加圣誕帽的程序(默認(rèn)參數(shù))并且在圖片上方顯示4個(gè)參數(shù)(x,y,w,h),即坐標(biāo)和帽子大小。

          如果是后者的話,我們會(huì)讓添加圣誕帽程序中的4個(gè)參數(shù)在原基礎(chǔ)上加減乘除用戶輸入的數(shù)字,并在圖片上方顯示最終的4個(gè)參數(shù)。

          最終效果如下

          ? 三、打包

          最后簡(jiǎn)單講一下如何將上面的程序打包為exe格式,讓沒(méi)有Python環(huán)境的用戶也能使用,首先下載pyinstaller模塊

          pip?install?pyinstaller

          如果你的上述項(xiàng)目代碼文件命名為:hat.py。那么你要用下面命令在cmd窗口進(jìn)行打包

          pyinstaller?hat.py

          打包過(guò)程會(huì)有點(diǎn)慢。成功后,在py文件所在文件夾找到一個(gè)dist的子文件夾。進(jìn)去之后,找到pachong.exe文件并運(yùn)行它即可。文件夾里附帶了很多文件,你可以刪除它。

          最后早起也將源碼和打包后的程序提供給大家下載,你可以在公眾號(hào)「早起Python」后臺(tái)回復(fù)圣誕即可。

          因?yàn)榇虬蟮膃xe較大(200多M),為了方便大家從Python腳本中使用,你必須按照本文開頭提示的安裝對(duì)應(yīng)模塊與下載插件,如果有問(wèn)題的話,相信下面的tips可以幫到你。

          如果不打包的話,先把圣誕帽的圖片(png格式)和代碼程序放在相同路徑下。

          進(jìn)到軟件后先點(diǎn)擊瀏覽按鈕選擇圖片存儲(chǔ)路徑(注意:路徑內(nèi)不能出現(xiàn)中文,只能英文+數(shù)字,這可能是因?yàn)镻ython中的OpenCV庫(kù)的bug)。完畢后就可以看到下方所在文件夾的全.jpg.png文件。點(diǎn)擊一個(gè)你想要添加圣誕帽的圖片,在按Go按鈕,在右邊的圖片框中就會(huì)刷新已經(jīng)代碼帽子的頭像!同時(shí),在程序的路徑下也會(huì)有這張圖片的.jpg格式文件。

          圖片框中除了圖片還有4個(gè)參數(shù),4個(gè)參數(shù)的作用就是調(diào)節(jié)帽子大小和位置。因?yàn)槊繌垐D片不同,所以帽子會(huì)出現(xiàn)大小不一、偏移的情況。而后,你就需要在左邊的4個(gè)輸入框中輸入?yún)?shù)來(lái)調(diào)試(4個(gè)輸入框是在原參數(shù)基礎(chǔ)上進(jìn)行數(shù)乘運(yùn)算),以達(dá)到帽子的最佳效果,如果超出范圍,命令框會(huì)提示錯(cuò)誤。輸入后還是一樣按Go鍵,結(jié)束按Cancel鍵。


          以上就是本文的分享,你可以在本文的基礎(chǔ)上進(jìn)行修改來(lái)實(shí)現(xiàn)不同的效果,如果你喜歡的話,請(qǐng)點(diǎn)贊、在看、轉(zhuǎn)發(fā)支持一下,謝謝!


          -END-


          文末推薦一本《億級(jí)流量Java高并發(fā)與網(wǎng)絡(luò)編程實(shí)戰(zhàn)》由核心技術(shù)、應(yīng)用框架和數(shù)據(jù)處理三部分組成。核心技術(shù)介紹了與高并發(fā)相關(guān)的架構(gòu)設(shè)計(jì)及多線程、NIO、網(wǎng)絡(luò)編程等底層技術(shù);應(yīng)用框架講解了目前流行的一些高并發(fā)及分布式框架技術(shù),如Disruptor、Spring Boot、Spring Cloud 等;數(shù)據(jù)處理部分重點(diǎn)介紹如何使用關(guān)系型數(shù)據(jù)庫(kù)、非關(guān)系型數(shù)據(jù)庫(kù)及大數(shù)據(jù)領(lǐng)域的MapReduce 技術(shù)處理海量數(shù)據(jù),從而為高并發(fā)場(chǎng)景提供一套完善的存儲(chǔ)方案

          除了直接點(diǎn)擊上方小程序購(gòu)買會(huì)有折扣,本周將會(huì)對(duì)閱讀和分享榜單按照排名進(jìn)行贈(zèng)送,歡迎添加早小起微信進(jìn)行參與和圍觀?




          掃碼添加早小起

          1.?回復(fù)「進(jìn)群」進(jìn)入Python技術(shù)交流群

          2. 回復(fù)「Python」獲得Python技術(shù)圖書

          3. 回復(fù)「習(xí)題」領(lǐng)取Python數(shù)據(jù)處理200題




          瀏覽 24
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天综合网天天综合7799 | 在线观看亚州视频 | 亚洲国产精品成人综合色丿丿 | 黄色视频在线观看免费 | 国产精品色色色 |