给照片换脸大家应该都见过,本文我们来介绍一下如何通过 Python 实现换脸。

功能实现

实现换脸功能,我们大致可以分为两种:一种是所有功能都通过自己编码来实现,另一种是借助于第三方 API 来实现,第一种方式可能需要我们进行大量的编码才能实现,而第二种方式我们只需进行少量的编码即可实现。

本文我们使用更简单的第二种方式来实现,我们用到的 API 接口提供方是 Face++,首先我们需要到该网站注册一个自己的账号,注册地址为:https://console.faceplusplus.com.cn/register,打开后如下所示:

我们可以通过手机号和邮箱两种方式来注册,注册好账号之后,我们再到登录地址 https://console.faceplusplus.com.cn/login 进行登录,登录之后,我们会发现网站已经为我们创建好了应用,如下图所示:

我们需要用到的是上图中的 API KeyAPI Secret 的值,下面来看一下具体实现代码:

# 获取人脸关键点
def find_face(imgpath):print("正在查找……")http_url = "https://api-cn.faceplusplus.com/facepp/v3/detect"data = {"api_key": "自己的 api_key","api_secret": "自己的 api_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 = json.JSONDecoder().decode(req_con)this_json = simplejson.dumps(req_dict)this_json2 = simplejson.loads(this_json)print(this_json2)faces = this_json2['faces']list0 = faces[0]rectangle = list0['face_rectangle']# print(rectangle)return rectangle# 换脸,图片的大小应不超过 2M,number 表示换脸的相似度
def merge_face(image_url1, image_url2, image_url, number):ff1 = find_face(image_url1)ff2 = find_face(image_url2)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(rectangle2)url_add = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface"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()data = {"api_key": "自己的 api_key","api_secret": "自己的 api_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_con1 = response.content.decode('utf-8')req_dict = json.JSONDecoder().decode(req_con1)result = req_dict['result']imgdata = base64.b64decode(result)file = open(image_url, 'wb')file.write(imgdata)file.close()

效果展示

示例 1

首先,我们使用两位男明星的图片进行效果展示,原图如下所示:

换脸后的效果图如下所示:

示例 2

接着,我们再使用两位女明星的图片进行效果展示,原图如下所示:

换脸后的效果图如下所示:

链接​mp.weixin.qq.com

100行的python作品详解_不到 100 行 Python 代码徐峥变葛优相关推荐

  1. 100行的python作品详解_漫画喵的100行Python代码逆袭

    小喵的唠叨话:这次的博客,讲的是使用python编写一个爬虫工具.为什么要写这个爬虫呢?原因是小喵在看完<极黑的布伦希尔特>这个动画之后,又想看看漫画,结果发现各大APP都没有资源,最终好 ...

  2. python etree详解_使用lxml.etree解析python alexa结果

    您遇到两个挑战: >使用名称空间的XML >两个共享相同名称空间前缀的名称空间 具有两个不同名称空间重用前缀的XML文档 您会看到" aws:"前缀,但是它用于两个不同 ...

  3. python学习详解_深入解析Python小白学习【操作列表】

    1.遍历列表 需要对列表中的每个元素都执行相同的操作时,可使用for 循环: magicians = ['alice','david','carolina'] for magician in magi ...

  4. python argv 详解_对python中的argv和argc使用详解

    主要问题 为什么argv中第一个,即index=0的内容就是文件名? python中argc是用什么实现的? 概念解释 argc:argument counter,命令行参数个数 argv:argum ...

  5. python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继 ...

  6. python凯撒密码详解_四十八、Python用smtp发邮件详解(163和QQ邮箱)

    Python发邮件详解 一.利用163的smtp发送邮件 import smtplibfrom email.mime.text import MIMETextfrom email.header imp ...

  7. python跳一跳脚本详解_微信跳一跳游戏 python脚本辅助得高分

    微信小程序一时间火爆朋友圈,关键是还有排行榜!游戏操作简单,可直接根据电脑识别,用python写出自动跳辅助脚本,本想动手写下,索性网上有大神写了现成脚本,修改了一小部分参数,就可以稳定使用了霸榜没有 ...

  8. python语法详解_解析 Python3 基础语法

    行与缩进 python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} . 缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数.实例如下: if True: print ( ...

  9. linux shell编程与编辑器使用详解_使用 Mu 编辑器教授 Python | Linux 中国

    导读:Mu 让你轻松学会如何编写 Python 代码. 本文字数:2147,阅读时长大约: 3分钟https://linux.cn/article-12654-1.html 作者:Don Watkin ...

最新文章

  1. 【工作经验分享】mysql备份恢复命令
  2. 在Python中实现SVM分类
  3. 小程序 富文本自适应屏幕_自适应文本:跨屏幕尺寸构建可读文本
  4. 玩转oracle 11g(42):增加表空间
  5. python3 week4
  6. python redis模块_大数据入门4 | Redis安装及python中的redis模块加载
  7. html5两个静态页面传值,如何使用HTML5Viewer 进行参数传递
  8. openwrt: Makefile 框架分析[转载]
  9. FPGA编程入门:Quartus II 设计1位全加器
  10. 图解:卷积神经网络数学原理
  11. [Zer0pts2020]easy strcmp
  12. 2022-05-08 Unity核心5——Tilemap
  13. 设计一个自我介绍简单页面
  14. 电脑可以连接别的手机热点,唯独连接不上某个手机热点怎么办法?
  15. [MFC]CFile类实现低级文件I/O
  16. 陶敏修《高阶Perl》访谈录(来自The Perl Review)
  17. 零基础学Java_Map接口、HashMap 类、HashTable 类、TreeMap 类(整理总结)
  18. php全套之七,【独家首发】最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上...
  19. IC验证基础面试题总结
  20. 调用iframe中的js方法_SolidWorks中标准件库的创建及调用方法

热门文章

  1. HP-UX匿名ftp的upload权限问题
  2. Day_04-数组,元组,列表
  3. 两张超级大表join优化
  4. codeforces 954C
  5. python os模块的学习
  6. 如何做好错误处理?(PHP篇)
  7. 机器学习如何改变大数据管理
  8. 【三分+枚举】LNOI2017 d1t1 期末考试
  9. 团队项目第二阶段冲刺站立会议06
  10. 两种比较不错的密码修改方案