You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.3 KiB
89 lines
3.3 KiB
# pip install requests
|
|
# pip install simplejson
|
|
# https://www.faceplusplus.com.cn/v2/pricing/#price-tab-header
|
|
import requests
|
|
import json
|
|
import simplejson
|
|
import base64
|
|
import os
|
|
|
|
|
|
# 第一步:获取人脸关键点
|
|
def find_face(imgpath):
|
|
"""
|
|
:param imgpath: 图片的地址
|
|
:return: 一个字典类型的人脸关键点 如:{'top': 156, 'left': 108, 'width': 184, 'height': 184}
|
|
"""
|
|
http_url = 'https://api-cn.faceplusplus.com/facepp/v3/detect' # 获取人脸信息的接口
|
|
data = {
|
|
"api_key": "x2NyKaa6vYuArYwat4x0-NpIbM9CrwGU", # 访问url所需要的参数
|
|
"api_secret": "OuHx-Xaey1QrORwdG7QetGG5JhOIC8g7", # 访问url所需要的参数
|
|
"image_url": imgpath, # 图片地址
|
|
"return_landmark": 1
|
|
}
|
|
|
|
files = {'image_file': open(imgpath, 'rb')} # 定义一个字典存放图片的地址
|
|
response = requests.post(http_url, data=data, files=files)
|
|
res_con1 = response.content.decode('utf-8')
|
|
res_json = simplejson.loads(res_con1)
|
|
faces = res_json['faces']
|
|
list = faces[0]
|
|
rectangle = list['face_rectangle']
|
|
return rectangle
|
|
|
|
|
|
# 第二步:实现换脸
|
|
def merge_face(image_url1, image_url2, image_url, number):
|
|
"""
|
|
:param image_url1: 被换脸的图片路径
|
|
:param image_url2: 换脸的图片路径
|
|
:param image_url: 换脸后生成图片所保存的路径
|
|
:param number: 换脸的相似度
|
|
"""
|
|
# 首先获取两张图片的人脸关键点
|
|
face1 = find_face(image_url1)
|
|
face2 = find_face(image_url2)
|
|
# 将人脸转换为字符串的格式
|
|
rectangle1 = str(
|
|
str(face1['top']) + "," + str(face1['left']) + "," + str(face1['width']) + "," + str(face1['height']))
|
|
rectangle2 = str(
|
|
str(face2['top']) + "," + str(face2['left']) + "," + str(face2['width']) + "," + str(face2['height']))
|
|
# 读取两张图片
|
|
f1 = open(image_url1, 'rb')
|
|
f1_64 = base64.b64encode(f1.read())
|
|
f1.close()
|
|
f2 = open(image_url2, 'rb')
|
|
f2_64 = base64.b64encode(f2.read())
|
|
f2.close()
|
|
|
|
url_add = 'https://api-cn.faceplusplus.com/imagepp/v1/mergeface' # 实现换脸的接口
|
|
data = {
|
|
"api_key": "EAMxLayICnPS7IHIgx5zFOqpNic4vlDT",
|
|
"api_secret": "88Mrytzh_bk_GkjkxVQxNdhXYJkhiorZ",
|
|
"template_base64": f1_64,
|
|
"template_rectangle": rectangle1,
|
|
"merge_base64": f2_64,
|
|
"merge_rectangle": rectangle2,
|
|
"merge_rate": number
|
|
}
|
|
response1 = requests.post(url_add, data=data)
|
|
res_con1 = response1.content.decode('utf-8')
|
|
res_dict = json.JSONDecoder().decode(res_con1)
|
|
result = res_dict['result']
|
|
imgdata = base64.b64decode(result)
|
|
file = open(image_url, 'wb')
|
|
file.write(imgdata)
|
|
file.close()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
backup_dir = '../Image/Backup/TestSource'
|
|
paths = os.walk(backup_dir)
|
|
for path, dir_lst, file_lst in paths:
|
|
for file_name in file_lst:
|
|
if file_name.endswith(".png"):
|
|
face1 = os.path.join(path, file_name)
|
|
face2 = "../Image/wife.jpg"
|
|
face3 = face1.replace('.png', '').replace("TestSource","TestTarget") + "_" + face2.split('/')[-1] # 把face2的脸换到face1图片中的脸上去
|
|
merge_face(face1, face2, face3, 100)
|