最近做的一個Tkinter和人臉融合相結合的項目,用了雙層的tk視窗,人臉融合的部分用的是百度智能雲的接口,可以自行去注冊接口參數,這裡就不提供了。
直接上源碼:
import tkinter
from tkinter import filedialog
from PIL import Image, ImageTk
from fuse import face_fuse
def get_pic1(): # 選擇圖檔1
global path1
path1 = filedialog.askopenfilename()
img = Image.open(path1).resize((400, 400))
img = ImageTk.PhotoImage(img)
lab1.img = img
lab1.configure(image=img)
def get_pic2(): # 選擇圖檔2
global path2
path2 = filedialog.askopenfilename()
img = Image.open(path2).resize((400, 400))
img = ImageTk.PhotoImage(img)
lab2.img = img
lab2.configure(image=img)
def face_page():
# 建立二級界面
page = tkinter.Toplevel()
page.geometry("420x420")
page.title("人臉融合")
# 融合視窗
lab = tkinter.Label(page, relief="groove")
lab.place(x=10, y=10, width=400, height=400)
# 開始融合
face_fuse(path1, path2)
# 展示圖檔
img = Image.open('new.png').resize((400, 400))
img = ImageTk.PhotoImage(img)
lab.image = img
lab.configure(image=img)
window = tkinter.Tk()
window.geometry("830x500")
window.title("人臉融合")
# 展示圖檔标簽1
lab1 = tkinter.Label(window, relief="groove")
lab1.place(x=10, y=10, width=400, height=400)
# 展示圖檔标簽2
lab2 = tkinter.Label(window, relief="groove")
lab2.place(x=420, y=10, width=400, height=400)
# 選擇圖檔按鈕1
btn1 = tkinter.Button(window, text="選擇圖檔1", font=("微軟雅黑", 16), command=get_pic1)
btn1.place(x=110, y=420, width=200, height=60)
# 選擇圖檔按鈕2
btn2 = tkinter.Button(window, text="選擇圖檔2", font=("微軟雅黑", 16), command=get_pic2)
btn2.place(x=520, y=420, width=200, height=60)
# 開始融合按鈕
btn = tkinter.Button(window, text="開始融合", font=("微軟雅黑", 16), command=face_page)
btn.place(x=365, y=420, width=100, height=60)
window.mainloop()
fuse為本地檔案,裡面主要是人臉融合的代碼。access_token需要自己去百度智能雲注冊應用擷取。
import base64
import json
import requests
def face_base64(img): # 擷取圖檔的base64值
f = open(img, 'rb')
img_date = f.read()
data = base64.b64encode(img_date)
data = data.decode()
return data
def face_fuse(face1, face2): # 人臉融合
request_url = "https://aip.baidubce.com/rest/2.0/face/v1/merge"
params = {
"image_template":
{"image": face_base64(face1), "image_type": "BASE64"},
"image_target":
{"image": face_base64(face2), "image_type": "BASE64"}
}
params = json.dumps(params)
access_token = '自行擷取'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/json'}
response = requests.post(request_url, data=params, headers=headers)
if response:
content = response.json()
img = content["result"]["merge_image"]
temp = base64.b64decode(img)
with open('new.png', "wb") as f:
f.write(temp)
f.close()
測試之前一定要去擷取token哦,這是接口的注意事項。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2UWZyMTOxgjY3EjYhNWZ5YWMzQjZ4gzYyYDOmhTN5I2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)