逛b站发现好多换脸的视频,然后就想自己试试,闲着用python写了一下。害,虽然是写了一下午的东西,但是最后效果不是非常好,但是各种恶搞还是蛮有趣的。
我采用了旷视的接口,要用的话需要注册旷视的开发者,但是使用是免费的地址在这https://www.faceplusplus.com.cn/,创建一个实例就可以使用啦,代码里面需要把key和secret换成你自己的。
下面展示一下python代码
# -*- coding: utf-8 -*-
# @Time :2020年9月6日15:08:16
# @admin :miss
# @File :face.py
# @Software :PyCharm
# 导入所需要的库
import json
import requests
import simplejson
import base64
# 获取人脸关键点
def find_face(imgpath):
http_url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
data = {
"api_key":'输入你的key',
"api_secret":'输入你的secret',
"image_url":imgpath,
"return_landmark":1
}
files = {'image_file':open(imgpath,'rb')}
response = requests.post(http_url,data=data,files=files)
req_con = response.content.decode('utf-8')
this_json = simplejson.loads(req_con)
faces = this_json['faces']
list0 = faces[0]
rectangle = list0['face_rectangle']
return rectangle
# 换脸
def merge_face(image_url1,image_url2,image_url,number): # number换脸的相似度
ff1 = find_face(image_url1)
ff2 = find_face(image_url2)
f1 = open(image_url1,'rb')
#f1_64 = base64.b64decode(f1.read())
f1_64 = base64.b64encode(f1.read())
f1.close()
f2 = open(image_url2,'rb')
#f2_64 = base64.b64decode(f2.read())
f2_64 = base64.b64encode(f2.read())
f2.close()
rectangle1 = str(ff1['top']) + "," + str(ff1['left']) + "," + str(ff1['width'])+ "," + str(ff1['height'])
rectangle2 = str(ff2['top']) + "," + str(ff2['left']) + "," + str(ff2['width'])+ "," + str(ff2['height'])
url_add = 'https://api-cn.faceplusplus.com/imagepp/v1/mergeface'
data = {
"api_key":'输入你的key',"api_secret":'输入你的secret',
"template_base64":f1_64,"template_rectangle":rectangle1,
"merge_base64":f2_64,"merge_rectangle":rectangle2,"merge_rate":number
}
response1 = requests.post(url_add,data=data)
print(response1)
req_con1 = response1.content.decode('utf-8')
req_dict = json.JSONDecoder().decode(req_con1)
print(req_dict)
result = req_dict['result']
imgdata = base64.b64decode(result)
file = open(image_url,'wb')
file.write(imgdata)
file.close()
# 第一个是模板图图片,第二个是融合图的图片,第三个是生成后的图片地址
image1 = r"C:\Users\miss\Desktop\1.jpg"
image2 = r"C:\Users\miss\Desktop\2.jpg"
image = r"C:\Users\miss\Desktop\face.jpg"
merge_face(image1,image2,image,100)
开始的两张图片是这样子的:
看一下效果图:
到这就结束啦,当做娱乐还不错,像这种证件照的效果就很不错,但是日常的生活照就没有这么好的效果啦,这段时间很火的各种变脸饭思思就是很鲜明的例子。如下图所示xswl