赞
踩
目录
大时代换脸技术已经应用很多年了,很多已经在手机上面实现换脸技术了。我们Python也不能落后这个技术案例。利用python的技术,将两张照片合成一张照片,将脸部的轮廓,眼睛,鼻子进行更换。
利用开源的网站提供的接口文档(这里参考Face⁺⁺开源地址进行注册,在个人应用的界面领取key,secret进行接口使用),调用图像识别功能,使用face接口参数,将照片进行识别。将图片的相框的像素全部识别出来,将数据调用到另外一个接口内进行合并。合并的接口继续有开源的公司提供,将开源公司的接口发挥最大化,利用request方法进行请求,将数据进行base64位进行加密解密。用Json数据进行数据的转化,在调用开源公司的接口进行合并处理。
- import json
- import base64
- import requests
-
- # 算法
- # 构建模型
- # 训练模型 ---> 需要数据集
-
- # 找到人脸数据
- def find_face(imgpath):
- http_url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
- #参数
- data = {
- 'api_key': 'HLczng31fOqL9d4CGSHR92q1erJpclEp',
- 'api_secret': '_BPe6cvoxUUgJPdMcWst47nA_S-NI2Tq',
- 'img_url':imgpath,
- 'return_landmark':1
- }
- #文件以rb表示二进制的读取
- files = {'image_file':open(imgpath,'rb')}
- # 携带数据的请求我们通常使用post请求
- resp = requests.post(http_url,data=data,files=files)
- #req_con是个json格式的数据
- req_con = resp.text
- #类型转换
- this_dict = json.loads(req_con)
- faces = this_dict['faces']
- list0 = faces[0]
- #得到人脸框的数据
- rectangle = list0['face_rectangle']
- print("获得人脸数据:",rectangle)
- return rectangle
- # 拟合,拼接人脸
- def merge_face(img_url1,img_url2,img_url3,number):
- """
- :param img_url1: 第一张图像
- :param img_url2: 第二张图像
- :param img_url3: 合并后的效果图
- :param number:相似度
- :return:
- """
- #调用第一个函数,分别获取第一张图片和第二张图片的人脸数据
- ff1 = find_face(img_url1)
- ff2 = find_face(img_url2)
- #因为参数需要是字符串类型,而ff1和ff2都是字典,我们需要格式转换
- rectangle1 = str( str(ff1['top'])+","+str(ff1['left'])+","+str(ff1['width'])+","+str(ff1['height']) )
- rectangle2 = str( str(ff2['top'])+","+str(ff2['left'])+","+str(ff2['width'])+","+str(ff2['height']) )
- print("打印第一张图片的数据",rectangle1)
- print("打印第二张照片的数据",rectangle2)
- f1 = open(img_url1,'rb')
- f1_64 = base64.b64encode(f1.read()) #编码
- f1.close()
- f2 = open(img_url2, 'rb')
- f2_64 = base64.b64encode(f2.read()) # 编码
- f2.close()
-
- #合并,我们需要使用另一个接口
- url_add = 'https://api-cn.faceplusplus.com/imagepp/v1/mergeface'
- #调用参数
- data = {
- 'api_key': 'HLczng31fOqL9d4CGSHR92q1erJpclEp',
- 'api_secret': '_BPe6cvoxUUgJPdMcWst47nA_S-NI2Tq',
- 'template_base64':f1_64,'template_rectangle':rectangle1,
- 'merge_base64':f2_64,'merge_rectangle':rectangle2,
- 'merge_rate':number
- }
- resp = requests.post(url_add,data=data)
- req_con = resp.text
- # 把json转化为字典,作用和上面那个一样,殊途同归
- req_dict = json.JSONDecoder().decode(req_con)
- # 类型转化
- result = req_dict['result']
- imgdata = base64.b64decode(result)
- # 用wb写入这张图像
- file = open(img_url3,'wb')
- file.write(imgdata)
- file.close()
-
- if __name__=="__main__":
- img1 = r"E:\test\3.jpg"
- img2 = r"E:\test\4.jpg"
- img3 = r"E:\test\result.jpg"
- merge_face(img1,img2,img3,30)
3.jgp图片
4.jpg图片
合成效果图片result.jpg
合成照片,先将两个照片预处理,保持眼睛和鼻子、轮廓一致。调用现成用好的接口,直接配合参数使用。可以简单进行AI换脸,但是遇到模糊,或者照片不清楚情况,不能进行AI的合成。下次研究一下动态换脸技术,将摄像头拍成视频换成动态。谢谢支持。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。