自动为你的照片带上一副眼镜
咪哥杂谈
本篇阅读时间约为 6 分钟。
1
前言
上篇文章讲解了如何将我们的"附属品"(例如眼镜、圣诞帽、口罩)图片背景透明化,那今天来介绍下实现自动带上眼镜的方法,通过人脸识别,识别出大概的位置,然后将图片覆盖上去。
最终实现效果:
2
环境准备
安装好之前两篇文章内容提到的第三方库。
回顾链接:
如何用技术手段将图片背景变为透明?
用Python鬼畜特朗普照片,了解下?
3
原理思路讲解
1. 裁剪眼镜图片,以左上角为基点
随便网上找一张眼镜图片,原本大小为下图所示:
使用程序来实现图片叠加,是以图片左上角为基准,显然,如果用现在这个图片附到周董开车的脸上,眼镜的这张图片即使透明化也不能完美的贴上去。
所以需要尽可能的将眼镜图片裁剪成如下的样子(白色背景是图片实际大小):
2. 人脸识别库,识别出人脸的左侧脸颊和左眼眉的空间点
人脸识别库可以帮我们识别出特征值的坐标,如果想得到画红线的部分大概坐标,只需要你获取左侧脸颊的x坐标以及左侧眼眉的y坐标,即可得到差不多的位置。
(左脸颊x坐标,左眼眉y坐标),这组坐标即是我们要将眼镜图片以左上角为基准,贴过来的图片。
对比看下,眼镜腿是不是差不多在红框的位置:
3. 重塑眼镜图片尺寸大小
图片都是由像素点组成,每张照片的长宽都不一样,而眼镜图片的大小也一样,单纯的裁剪工具并不能完美的使眼镜附和到周董图片上。所以这里就有了一步重新塑造图片大小的步骤。
"附属品"的图片大小,需要根据原图片的像素算出一个缩小比例的因子,根据因子对"附属品"图片进行对应的比例进行缩小。
而这个因子如何计算?(需要点基础数学知识)
需要得知眼镜原图片的长像素,比如我的现在眼镜原图像素为:
而周董原图中,脸颊的左端点到右端点可以计算出来:
所以等比缩放因子,即 脸颊像素长度/眼镜图片长度像素。
案例中,缩放因子 = 446/1586 ≈ 0.28
4. 组合图片
以上所有步骤准备好后,直接将眼镜图片组合到周董图片上即可。
4
置换图片,呈现结果
下图是胡歌在录制《朗读者》时候的一个截图:
自动戴眼镜,成像之后:
5
总结
思路给大家梳理了一遍,其实熟悉我写作风格的小伙伴应该明白,编程思路有了,实现并不是难题。
其中需要动脑子的地方,就是关于”附属品“图片的等比例缩小,有个简单的小算法,还有一个地方就是"附属品"图片的左上方坐标,对标到人脸的左脸颊上方。
对于代码的细节,我没有在文章中写出来,写出来估计会很枯燥,如果你对源代码感兴趣,老规矩,我上传到 github 了。
后台回复 "眼镜" ,即可获得源码地址。
题图 - pexels - Philipp Birmes
▼
往期精彩回顾
▼
如何用技术手段将图片背景变为透明?
用Python鬼畜特朗普照片,了解下?
自动为你的照片带上一副眼镜相关推荐
- word怎么在下一页添加表头_word表格在换页时能否自动在新换页上带上表头,如何设置...
展开全部 word表格在换页时能自动在新e69da5e887aa3231313335323631343130323136353331333431353262换页上带上表头,具体操作请参照以下步骤: 1 ...
- 利用python+selenium带上cookies自动登录bilibili
利用python+selenium带上cookies自动登录bilibili 环境 selenium的安装 思路 第一部分:手动登录,保存cookies 第二部分:读取cookies自动登录 环境 环 ...
- postman发送object_.NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部...
奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了. 可奇怪的是我们的请求在运 ...
- .NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部?
奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了.可奇怪的是我们的请求在运行 ...
- chrome 请求带上cookie_【编号0002】请求头的内容,及其相关知识铺垫
更新时间,来一篇关于请求头的内容介绍 首先,什么是请求头?这里指的是HTTP 1 版本中的请求信息的头部内容,注意,不含主体 0. 背景说明 客户端:你的浏览器 服务器:指的是网站服务器 请求:客户端 ...
- 自动驾驶系统为何要打上「思想钢印」?北京顺义闹市区里藏着毫末智行的谜底...
贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 城市领航辅助驾驶,已经是"现货"了. 北京顺义闹市区,11公里自动驾驶全程无接管: 明年上线交付,技术来自毫末智行,一 ...
- dedecms系统列表页调用tag标签同时带上链接的方法
小编给大家分享一下dedecms系统列表页调用tag标签同时带上链接的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧! dedecms系统列表页如何调用tag标签同时带上链接? 织 ...
- LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView
LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView 点击查看2.x版本,功能更强大 主要功能: 自带上拉加载和下拉刷新 可以添加100条头条目和尾条目(其实是可 ...
- 睡袋放置_第一次露营要带上什么?帐篷、睡袋怎么挑、怎么买?新手入门攻略...
第一次露营要带上什么?帐篷.睡袋怎么挑.怎么买?介绍 4 种必备装备.挑选攻略,让你轻松体验Camping的乐趣. 露营已成为大众周末休闲的热门选项.比起踏青.爬山,露营能让人以更全面.轻松的姿态来拥 ...
最新文章
- Vue.js——vue-resource全攻略
- ASCII Unicode GBK UTF的联系
- numpy 平方_Numpy的终极备忘录
- php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中
- 下载丨8月数据库技术通讯:不合理业务设计导致CPU飙升
- 量化风控学习:原来评分卡模型的概率是这么校准的!
- Android开发笔记(四十三)点击事件
- mysql 幻读和不可重复读_幻读和不可重复读的区别
- php当前页面删除处理,php删除记录同时刷新当前页面的实现代码
- 《编写有效用例阅读笔记二》
- TRC文件转ASC文件
- Unity 射线检测
- 学生服务器是什么?学生服务器有什么用?
- java毕业设计选题基于JavaWeb实现疫情环境下校园宿舍|寝室管理系统
- 日语N2听力常用词汇
- 六种方法教你更好地使用小型WiFi摄像机
- matlab 重叠峰分解 算法,一种基于粒子群算法的光谱重叠峰分解方法与流程
- 学习新时代编程语言Rust-12小胖的裤子
- Nginx中文域名配置
- 10、Horizon RDS远程桌面服务和应用程序池配置
热门文章
- Termux 使用手册
- openwrt 版本下载
- 解读:什么是JavaEE?JavaEE就业如何?
- C语言程序编写如何判断互质,CCF NOI1028 判断互质
- 千亿气象服务市场,墨迹天气“吃肉”还是“喝汤”?
- IIS7.5 FTP站点正确设置及启用用户隔离和绑定主机名(踩坑记)
- js获取当前应用根路径contextPath完美方案
- c# 操作excel(1)
- ES6 Promise对象和then()的用法
- 电骡协议规范(三):客户端和服务器之间的UDP通讯