# 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/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)