天天看點

百度智能雲-人臉融合

最近做的一個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哦,這是接口的注意事項。

百度智能雲-人臉融合