使用 python 进行 面部合成
完整代码已上传至GitHub:
https://github.com/chestnut-egg/Face
一. 准备工作
1. 此程序使用的是 Face++ 的API,所以需要去Face++官网注册账号:
https://www.faceplusplus.com.cn/
2. 创建应用,获取 key 和 secret
3. 下载 simplejson 模块 ,使用pip就可以下载了
pip install simplejson
二. 程序思路
1. 使用 decect 接口,获取人脸关键点
接口详细文档:
https://console.faceplusplus.com.cn/documents/4888373
* return_landmark 参数 不能为 0 不然不会返回人脸关键点
return_landmark |
Int |
是否检测并返回人脸关键点。合法值为:
注:本参数默认值为 0 |
核心代码:
def find_face(imgpath):
print("finding")
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')
req_dict = JSONDecoder().decode(req_con) this_json = simplejson.dumps(req_dict)
this_json2 = simplejson.loads(this_json) faces = this_json2['faces']
list0 = faces[0]
rectangle = list0['face_rectangle']
# print(rectangle)
return rectangle
2. 使用 mergeface 接口,合成脸部图像
接口详细文档:
https://console.faceplusplus.com.cn/documents/20813963
* 注意图片文件大小不超过 2 MB
核心代码:
# 模板图片地址 合成图片地址 生成图片地址 合成指数0-100
def add_face(image_url_1,image_url_2,image_url,number): ff1 = find_face(image_url_1)
ff2 = find_face(image_url_2) rectangle1 = str(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']) # print(rectangle1)
# print(rectangle2) url_add = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface" f1 = open(image_url_1, 'rb')
f1_64 = base64.b64encode(f1.read())
f1.close()
f2 = open(image_url_2, 'rb')
f2_64 = base64.b64encode(f2.read())
f2.close() data = {"api_key": key, "api_secret": secret, "template_base64": f1_64, "template_rectangle": rectangle1,
"merge_base64": f2_64, "merge_rectangle": rectangle2, "merge_rate": number} response = requests.post(url_add, data=data)
req_con = response.content.decode('utf-8')
req_dict = JSONDecoder().decode(req_con)
print(req_dict)
result = req_dict['result']
imgdata = base64.b64decode(result)
file = open(image_url, 'wb')
file.write(imgdata)
file.close()
3. 示例运行代码
# 单独两张照片的合成示例 image_url_1 = r"C:\Users\1.jpg"
image_url_2 = r"C:\Users\2.jpg"
image_url = r'C:\Users\result.jpg'
add_face(image_url_1,image_url_2,image_url,50)
4. 封装一个多张照片的合成函数
用 列表List 储存图片地址,先以最开始的两张进行合成,然后将合成后的图片与列表中的其他图像依次合成
* 程序没有做List的长度验证,注意边界特殊情况
def add_many(list_face): print("正在合成第1-2张")
image_now = r'C:\Users\now.jpg'
add_face(list_face[0], list_face[1], image_now, 50) for index in range(2,len(list_face)):
print("正在合成第"+str(index+1)+"张")
add_face(image_now, list_face[index], image_now, 50)
5. 成果展示
素材1:
素材2:
合成结果:
完整代码:
https://github.com/chestnut-egg/Face
使用 python 进行 面部合成的更多相关文章
- 基于opencv+Dlib的面部合成(Face Morph)
引自:http://blog.csdn.net/wangxing233/article/details/51549880 零.前言 前段时间看到文章[1]和[2],大概了解了面部合成的基本原理.这两天 ...
- python dlib 面部轮廓实时检测
1.dlib 实现动态人脸检测及面部轮廓检测 模型下载连接 : http://dlib.net/files/ # coding:utf-8 import cv2 import os import dl ...
- python利用opencv合成模糊图像
之前需要评估图像质量来筛选成像质量不错的图片,去除由于对焦,运动等造成的模糊图像,所以在构建数据集的时候考虑用opencv对清晰的图片进行处理获得模糊的图片从而进行训练. 1) 运动模糊图像 一般来说 ...
- [Python]PDF合成小程序PDF合成小程序
运行平台:Python3.5 用刀了PyPDF2这个库,需要提前下载好. 源码如下: import PyPDF2, os #建立一个装pdf文件的数组pdfFiles = [] for fileNam ...
- python多层数组合成一个数组后循环打印出数组内的每一项元素的方法
a=[1,2,3,4] b=[5,6,7,8] c=[a,b] def test(c): for i in c: return i print(test(c)) 以上代码执行后打印出来的结果是 预期目 ...
- 再学python类(终结篇)
续写 初学python类,这几天吃坏东西了,拖着虚弱的身躯写的.有些乱请各位看官海涵. 声明:本人编程新手,还在学习中.所表述的东西都是基础语法之类的,分享我的学习笔记.还望多多指点,我一定虚心接受. ...
- face-alignment:用 pytorch 实现的 2D 和 3D 人脸对齐库
使用世界上最准确的面对齐网络从 Python 检测面部地标,能够在2D和3D坐标中检测点. 项目地址:https://github.com/1adrianb/face-alignment 作者: 阿德 ...
- 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(1)- 环境搭建(Python2.7.14 + PyAudio0.2.11 + Matplotlib2.2.3 + SpeechRecognition3.8.1 + pyttsx3 2.7)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之环境搭建. 在写Jays-PySPEECH时需要先搭好开发环境,下表列出了开发过程中会用到的 ...
- Everybody Dance Now
一.摘要 作者提出了一种简单的动作迁移方法,实现了"do as I do":给定一个人跳舞的源视频,作者可以在目标对象表演标准动作的短短几分钟后,将该表演转移到一个新的(业余的)目 ...
随机推荐
- Flutter Weekly Issue 52
教程 一个易迁移.兼容性高的 Flutter 富文本方案 复杂业务如何保证Flutter的高性能高流畅度? 插件 flutter_color_models A wrapper for the Dart ...
- 浏览器插件之王-Tampermonkey(油猴脚本)
大家电脑都在使用浏览器,相信大家对浏览器插件也不陌生,浏览器插件是安装在浏览器里面,对浏览器功能进行拓展的脚本,现在的主流浏览器都有各种各样的插件如图: 这些插件让我们的上网方便了许多,有去广告的插件 ...
- radio样式
.radio{ position: relative; border: 1px solid #999; border-radius: 50%; width: 12px; height: 12px; b ...
- JasperReports入门教程(一):快速入门
JasperReports入门教程(一):快速入门 背景 现在公司的项目需要实现一个可以配置的报表,以便快速的适应客户的需求变化.后来在网上查资料发现可以使用JasperReports + Jaspe ...
- jQuery(*****)
参考1 参考2 1. jQuery 1. 选择器 $("") 1. 基本选择器 1. ID --> $("#d1") 2. 标签名 --> $(&q ...
- sort()实现排序的原理
很多人都只知道sort()是通过快速排序实现,但它并不只是简单的快排:首先它对普通的快速排序进行了优化:此外,它还结合了插入 排序和堆排序.系统根据数据形式和数据量,来选择合适的排序方法,这并不是说每 ...
- Memcached在企业中的应用
Memcached简介 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitz ...
- (转)ATOM介绍和使用
一,Atom介绍 Atom 是 Github 开源的文本编辑器,这个编辑器完全是使用Web技术构建的(基于Node-Webkit).启动速度快,提供很多常用功能的插件和主题,可以说Atom已经足以胜任 ...
- Mysql使用规范及建议
MySQL数据库使用规范一.建表规约1.[强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint (1表示是,0表示否) 说明:任何字段如果为非负数,必 ...
- CSS开发技巧(二):表格合并边框后的单元格宽度计算
前言: 分离边框模型和合并边框模型是表格的两种模型,它通过以下属性确定: border-collapse:separate(默认值) | collapse | inherit 当采用分离边框模型时,表 ...