咪哥杂谈

本篇阅读时间约为 6 分钟。

1

前言

上篇文章讲解了如何将我们的"附属品"(例如眼镜、圣诞帽、口罩)图片背景透明化,那今天来介绍下实现自动带上眼镜的方法,通过人脸识别,识别出大概的位置,然后将图片覆盖上去。

最终实现效果:

2

环境准备

安装好之前两篇文章内容提到的第三方库。

回顾链接:

如何用技术手段将图片背景变为透明?

用Python鬼畜特朗普照片,了解下?

3

原理思路讲解

1. 裁剪眼镜图片,以左上角为基点

随便网上找一张眼镜图片,原本大小为下图所示:

使用程序来实现图片叠加,是以图片左上角为基准,显然,如果用现在这个图片附到周董开车的脸上,眼镜的这张图片即使透明化也不能完美的贴上去。

所以需要尽可能的将眼镜图片裁剪成如下的样子(白色背景是图片实际大小):

2. 人脸识别库,识别出人脸的左侧脸颊和左眼眉的空间点

人脸识别库可以帮我们识别出特征值的坐标,如果想得到画红线的部分大概坐标,只需要你获取左侧脸颊的x坐标以及左侧眼眉的y坐标,即可得到差不多的位置。

(左脸颊x坐标,左眼眉y坐标),这组坐标即是我们要将眼镜图片以左上角为基准,贴过来的图片。

对比看下,眼镜腿是不是差不多在红框的位置:

3. 重塑眼镜图片尺寸大小

图片都是由像素点组成,每张照片的长宽都不一样,而眼镜图片的大小也一样,单纯的裁剪工具并不能完美的使眼镜附和到周董图片上。所以这里就有了一步重新塑造图片大小的步骤。

"附属品"的图片大小,需要根据原图片的像素算出一个缩小比例的因子,根据因子对"附属品"图片进行对应的比例进行缩小。

而这个因子如何计算?(需要点基础数学知识)

需要得知眼镜原图片的长像素,比如我的现在眼镜原图像素为:

而周董原图中,脸颊的左端点到右端点可以计算出来:

所以等比缩放因子,即 脸颊像素长度/眼镜图片长度像素。

案例中,缩放因子 = 446/1586 ≈ 0.28

4. 组合图片

以上所有步骤准备好后,直接将眼镜图片组合到周董图片上即可。

4

置换图片,呈现结果

下图是胡歌在录制《朗读者》时候的一个截图:

自动戴眼镜,成像之后:

5

总结

思路给大家梳理了一遍,其实熟悉我写作风格的小伙伴应该明白,编程思路有了,实现并不是难题。

其中需要动脑子的地方,就是关于”附属品“图片的等比例缩小,有个简单的小算法,还有一个地方就是"附属品"图片的左上方坐标,对标到人脸的左脸颊上方。

对于代码的细节,我没有在文章中写出来,写出来估计会很枯燥,如果你对源代码感兴趣,老规矩,我上传到 github 了。

后台回复 "眼镜" ,即可获得源码地址。

题图 - pexels - Philipp Birmes


往期精彩回顾

如何用技术手段将图片背景变为透明?

用Python鬼畜特朗普照片,了解下?

自动为你的照片带上一副眼镜相关推荐

  1. word怎么在下一页添加表头_word表格在换页时能否自动在新换页上带上表头,如何设置...

    展开全部 word表格在换页时能自动在新e69da5e887aa3231313335323631343130323136353331333431353262换页上带上表头,具体操作请参照以下步骤: 1 ...

  2. 利用python+selenium带上cookies自动登录bilibili

    利用python+selenium带上cookies自动登录bilibili 环境 selenium的安装 思路 第一部分:手动登录,保存cookies 第二部分:读取cookies自动登录 环境 环 ...

  3. postman发送object_.NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部...

    奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了. 可奇怪的是我们的请求在运 ...

  4. .NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部?

    奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了.可奇怪的是我们的请求在运行 ...

  5. chrome 请求带上cookie_【编号0002】请求头的内容,及其相关知识铺垫

    更新时间,来一篇关于请求头的内容介绍 首先,什么是请求头?这里指的是HTTP 1 版本中的请求信息的头部内容,注意,不含主体 0. 背景说明 客户端:你的浏览器 服务器:指的是网站服务器 请求:客户端 ...

  6. 自动驾驶系统为何要打上「思想钢印」?北京顺义闹市区里藏着毫末智行的谜底...

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 城市领航辅助驾驶,已经是"现货"了. 北京顺义闹市区,11公里自动驾驶全程无接管: 明年上线交付,技术来自毫末智行,一 ...

  7. dedecms系统列表页调用tag标签同时带上链接的方法

    小编给大家分享一下dedecms系统列表页调用tag标签同时带上链接的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!  dedecms系统列表页如何调用tag标签同时带上链接?  织 ...

  8. LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView

    LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView 点击查看2.x版本,功能更强大 主要功能: 自带上拉加载和下拉刷新 可以添加100条头条目和尾条目(其实是可 ...

  9. 睡袋放置_第一次露营要带上什么?帐篷、睡袋怎么挑、怎么买?新手入门攻略...

    第一次露营要带上什么?帐篷.睡袋怎么挑.怎么买?介绍 4 种必备装备.挑选攻略,让你轻松体验Camping的乐趣. 露营已成为大众周末休闲的热门选项.比起踏青.爬山,露营能让人以更全面.轻松的姿态来拥 ...

最新文章

  1. Vue.js——vue-resource全攻略
  2. ASCII Unicode GBK UTF的联系
  3. numpy 平方_Numpy的终极备忘录
  4. php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中
  5. 下载丨8月数据库技术通讯:不合理业务设计导致CPU飙升
  6. 量化风控学习:原来评分卡模型的概率是这么校准的!
  7. Android开发笔记(四十三)点击事件
  8. mysql 幻读和不可重复读_幻读和不可重复读的区别
  9. php当前页面删除处理,php删除记录同时刷新当前页面的实现代码
  10. 《编写有效用例阅读笔记二》
  11. TRC文件转ASC文件
  12. Unity 射线检测
  13. 学生服务器是什么?学生服务器有什么用?
  14. java毕业设计选题基于JavaWeb实现疫情环境下校园宿舍|寝室管理系统
  15. 日语N2听力常用词汇
  16. 六种方法教你更好地使用小型WiFi摄像机
  17. matlab 重叠峰分解 算法,一种基于粒子群算法的光谱重叠峰分解方法与流程
  18. 学习新时代编程语言Rust-12小胖的裤子
  19. Nginx中文域名配置
  20. 10、Horizon RDS远程桌面服务和应用程序池配置

热门文章

  1. Termux 使用手册
  2. openwrt 版本下载
  3. 解读:什么是JavaEE?JavaEE就业如何?
  4. C语言程序编写如何判断互质,CCF NOI1028 判断互质
  5. 千亿气象服务市场,墨迹天气“吃肉”还是“喝汤”?
  6. IIS7.5 FTP站点正确设置及启用用户隔离和绑定主机名(踩坑记)
  7. js获取当前应用根路径contextPath完美方案
  8. c# 操作excel(1)
  9. ES6 Promise对象和then()的用法
  10. 电骡协议规范(三):客户端和服务器之间的UDP通讯