聖誕節,教你用Python給微信頭像添加一個聖誕帽

作者 | 劉早起

來源 | 早起Python

聖誕節快到了,每年一到聖誕節就會有很多人的頭像上多了一頂小紅帽

那麼你有想過如何用Python去實現嗎?

如果你嘗試去搜索,會發現網上教程一大堆,但是由於大多數人都將聖誕帽位置固定了,所以放上自己的圖片後,要不就是聖誕帽偏移了,要不就是帽子比頭還大,代碼也不知道在哪裏改,無從下手。

因此,本文將手把手教你如何用Python爲你的微信頭像添加一頂聖誕帽,並結合PySimpleGUI,做成一個帶有GUI的小程序,先看效果:

本次主要分爲兩個部分講解:

  • 用opencv對頭像添加聖誕帽

  • 結合PySimpleGUI製作人性化聖誕帽添加軟件

主要涉及的Python模塊有:

  • PIL

  • PySimpleGUI

  • cv2

  • os

在開始之前,你需要使用pip對相關依賴庫進行安裝

pip install pillow   #這是對模塊PTL的安裝pip install opencv-python    #這是對cv2的安裝pip install os pip install PySimpleGui

利用opencv對頭像處理

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

爲了識別照片,我們需要安裝一個OpenCV的內置人臉識別插件,安裝步驟:

用瀏覽器打開網址opencv.org---進入Releases---下載對應版本的OpenCV(一定要記住存放這個插件的路徑!!!後面要用到)

和以前一樣,我們先看本節全部代碼,然後進行講解????

import cv2from PIL import ImagepersonPath = '3.jpg'  #頭像hatPath = 'sheng.png'  #聖誕帽personImg = cv2.imread(personPath)face_haar = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#存放的絕對路徑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)#將調整好的帽子貼上去personImg.save('addHat.png')

下面對代碼進行講解。

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

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

cv2.CascadeClassifier('分類器的路徑'):簡單來說就是做人臉檢測的一個必備方面,專業名詞叫做級聯分類器。這個分類器到目前版本容納了Haar特徵器和LBP特徵分類器兩個分類器。這次我們使用常規用的Harr特徵器”

Haar特徵分類器就是一個xml文件,是OpenCV官方訓練好的檢測器,它能反應圖像的灰度變化,以像素分模塊求差值的一種特徵。下面我們講講它的路徑

在我們準備工作中我們在OpenCV的官網下載了人臉識別的插件。

以安裝在D盤爲例,Harr特徵分類器就在我們的:

D:\opencv\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml

注意:在第6行代碼中,我們調用這個特徵器的路徑最好使用絕對路徑!上述代碼只是演示

關鍵代碼就是:

detectMultiScale(image,scaleFactor,minNeighbors)。

檢驗出圖片中的所有人臉,並以向量類型保存各個人臉的位置和大小,最後用矩形Rect類表示,該函數由分類器((也就是上述的Haar特徵分類器))的對象進行調用。

其中參數如下:

“image是我們要做人臉檢測的圖片。

scaleFactor表示在前後兩次相繼的掃描中,搜索窗口的比例係數。默認爲1.1即每次搜索窗口依次擴大10%;

minNeighbors表示構成檢測目標的相鄰矩形的最小個數(默認爲3個)。”

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

最後一個for循環就是讀取用cv2解析出來的帽子faces參數,這裏有趣的一點是,cv2做人臉識別後,會在兩眼之間畫一條線,並以中間爲原點,做x和y軸建立座標系。最後調節Pillow解析出來的帽子x和y位置,擺到人頭上方。所有這個方法對正臉敏感,對側臉不太友好。

personImg.save('addHat.png')表示存儲添加聖誕帽後的照片。

GUI框架整合

現在我們在上一節的基礎上,將聖誕帽添加與GUI框架進行整合,還是先上代碼之後拆分講解

import PySimpleGUI as sgimport os.pathsg.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("左邊的四個參數調節是在上面的參數基礎上進行加減乘除;其中寬度和高度調試單位爲個位數(需要大於0且是整數),橫縱移動調試單位可任意調",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:breakif event == "-FOLDER-":        folder = values["-FOLDER-"]try:            file_list = os.listdir(folder)except:            file_list = []        fnames = [            ffor f in file_listif 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:passelif event== "Go" :        personPath = filename'''        聖誕帽添加部分        '''        window["notice"].update()        window["-IMAGE-"].update(filename='addHat.png')window.close()

代碼解析,這裏強烈建議讀者結合GUI進階篇中的圖片查看器講解一起看。當然在做PySimpleGUI之前繼續嘮叨基本步驟:

“Import    Create some widgets   Create the window   Create the event loop”

這裏我們layout的擺放思路如下:一個聖誕帽添加鍵、一個退出程序鍵、4個文本框來調節圖片中的聖誕帽、一個列表箱子裝路徑下的所有圖片、一個圖片顯示框、幾條用於提示用戶的文本框。按照這個思路,我們就有了while循環上面的代碼編寫。

接着是loop事件循環:這裏我們以Go鍵促發聖誕帽添加,所以我們以這個按鈕爲第一個主if元素。

在按鈕Go促發前我們需要進行兩個判斷:

“一是文本框沒有輸入任何東西、

二是文本框輸入的東西。如果是前者,我們直接調動添加聖誕帽的程序(默認參數)並且在圖片上方顯示4個參數(x,y,w,h),即座標和帽子大小。”

如果是後者的話,我們會讓添加聖誕帽程序中的4個參數在原基礎上加減乘除用戶輸入的數字,並在圖片上方顯示最終的4個參數。

最終效果如下

打包

最後簡單講一下如何將上面的程序打包爲exe格式,讓沒有Python環境的用戶也能使用,首先下載pyinstaller模塊

pip install pyinstaller

如果你的上述項目代碼文件命名爲:hat.py。那麼你要用下面命令在cmd窗口進行打包

pyinstaller hat.py

打包過程會有點慢。成功後,在py文件所在文件夾找到一個dist的子文件夾。進去之後,找到pachong.exe文件並運行它即可。文件夾裏附帶了很多文件,你可以刪除它。

最後早起也將源碼和打包後的程序提供給大家下載,你可以在公衆號「早起Python」後臺回覆聖誕即可。

因爲打包後的exe較大(200多M),爲了方便大家從Python腳本中使用,你必須按照本文開頭提示的安裝對應模塊與下載插件,如果有問題的話,相信下面的tips可以幫到你。

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

進到軟件後先點擊瀏覽按鈕選擇圖片存儲路徑(注意:路徑內不能出現中文,只能英文+數字,這可能是因爲Python中的OpenCV庫的bug)。完畢後就可以看到下方所在文件夾的全部.jpg和.png文件。點擊一個你想要添加聖誕帽的圖片,在按Go按鈕,在右邊的圖片框中就會刷新已經代碼帽子的頭像!同時,在程序的路徑下也會有這張圖片的.jpg格式文件。

圖片框中除了圖片還有4個參數,4個參數的作用就是調節帽子大小和位置。因爲每張圖片不同,所以帽子會出現大小不一、偏移的情況。而後,你就需要在左邊的4個輸入框中輸入參數來調試(4個輸入框是在原參數基礎上進行數乘運算),以達到帽子的最佳效果,如果超出範圍,命令框會提示錯誤。輸入後還是一樣按Go鍵,結束按Cancel鍵。”

以上就是本文的分享,你可以在本文的基礎上進行修改來實現不同的效果。


更多精彩推薦
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章