android 美颜 技术点,《Android 美颜类相机开发汇总》第六章 Android OpenGLES 美妆定制实现...
美妆介绍
美颜类相机中一般会有彩妆功能,彩妆基本上都是贴图实现,这跟动态贴纸的贴图又不一样,动态贴纸的贴图一般是通过对贴纸进行透视变换实现的。
美妆分类
美妆主要包括唇彩、腮红、眼影、眼线、双眼皮、美瞳、眉毛、阴影修容等处理。具体的思路如下:
唇彩
唇彩功能,一般是通过遮罩来处理的。嘴巴的遮罩图三角剖分如下所示:
唇彩遮罩三角剖分
对应的关键点三角剖分如下:
唇彩三角剖分
通过遮罩得到嘴唇的位置之后,经过lookup table 颜色查找表映射实现唇彩(口红)功能。
腮红
腮红一般是直接将腮红的素材绘制的脸颊中,因此我们需要根据脸颊的功能,将素材纹理进行三角剖分:
腮红素材三角剖分
与腮红素材对应的关键点三角剖分如下:
脸颊关键点三角剖分
眉毛部分
眉毛部分是直接绘制素材实现的。
眼睛部分
眼睛部分包括眼影、眼线、双眼皮等彩妆,其实实现都是类似的。都需要根据人眼关键点做三角剖分处理。比如眼影的三角剖分如图所示:
眼影素材三角剖分.png
眼睛关键点三角剖分
美瞳
一般情况下美瞳的实现是将一个圆形的瞳孔绘制到眼睛的瞳孔上,覆盖了原来的瞳孔,然后根据前面的眼睛遮罩将,超出眼眶的瞳孔部分裁掉。
美妆的实现
经过前面的三角剖分和数据标注之后,我们就可以根据数据来绘制实现美妆功能了。
在拿到三角剖分数据之后,我们就可以通过glDrawElements 方法,将素材的纹理坐标绘制出来,这样素材就贴合到人脸上了。并且这样做比单纯的绘制素材更好地处理扭头、抬头、低头等原因导致的形变。Triangulation本身就能很好地处理形变过程,由于人脸的关键点是固定的,所以我们并不需要每次都用Delaunay三角算法来计算三角形,能够更好地做实时渲染处理。
对于唇彩来说,一般是通过Lookup Table 颜色查找表对嘴唇的颜色进行映射得到。由于嘴唇的颜色比较单一,所以我们可以采用 64 x 64 大小 lut 来映射唇彩纹理。OpenGL的shader实现如下:
if (makeupType == 3) { // 映射唇彩
lowp vec4 textureColor = texture2D(inputTexture, textureCoordinate.xy);
lowp vec4 lipMaskColor = texture2D(maskTexture, maskCoordinate.xy);
if (lipMaskColor.r > 0.005) {
mediump vec2 quad1;
mediump vec2 quad2;
mediump vec2 texPos1;
mediump vec2 texPos2;
mediump float blueColor = textureColor.b * 15.0;
quad1.y = floor(floor(blueColor) / 4.0);
quad1.x = floor(blueColor) - (quad1.y * 4.0);
quad2.y = floor(ceil(blueColor) / 4.0);
quad2.x = ceil(blueColor) - (quad2.y * 4.0);
texPos1.xy = (quad1.xy * 0.25) + 0.5/64.0 + ((0.25 - 1.0/64.0) * textureColor.rg);
texPos2.xy = (quad2.xy * 0.25) + 0.5/64.0 + ((0.25 - 1.0/64.0) * textureColor.rg);
lowp vec3 newColor1 = texture2D(materialTexture, texPos1).rgb;
lowp vec3 newColor2 = texture2D(materialTexture, texPos2).rgb;
lowp vec3 newColor = mix(newColor1, newColor2, fract(blueColor));
textureColor = vec4(newColor, 1.0) * (lipMaskColor.r * strength);
} else {
textureColor = vec4(0.0, 0.0, 0.0, 0.0);
}
gl_FragColor = textureColor;
}
对于其他素材来说,就是直接绘制到FBO即可:
if (makeupType == 1) { // 绘制不带遮罩的彩妆素材,此时inputTexture是素材纹理
lowp vec4 textureColor = texture2D(inputTexture, textureCoordinate.xy);
gl_FragColor = textureColor * strength;
}
其他素材比如眼影、眼线、眉毛等也是一样的过程,都是找到素材纹理顶点,人脸纹理顶点,然后通过glDrawElements方法将素材的三角剖分数据绘制出来即可。
至此,我们就介绍完彩妆功能了。
由于缺乏彩妆素材,这里只介绍如何彩妆的大体流程,大致流程可以参考本人的项目:
CainCamera
项目只做了唇彩的大概实现过程。其他的彩妆功能,大家可以自行实现。
android 美颜 技术点,《Android 美颜类相机开发汇总》第六章 Android OpenGLES 美妆定制实现...相关推荐
- 《Android 美颜类相机开发汇总》第五章 Android OpenGLES 美颜定制实现
在介绍美颜定制之前,我们先来复习一下OpenGL中图像绘制原理.OpenGL的图像绘制,是由许许多多三角形构成的.OpenGL的绘制离不开三角形的绘制.通常对于不需要对图像细节进行处理的时候,我们一般 ...
- Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧...
第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息 屏幕大小:屏幕对角线长度,单位"寸": 分辨率:手机屏幕像素点个数,例如720x1280分辨率: PPI(Pixels ...
- 浅入浅出 Android 安全:第六章 Android 安全的其它话题
第六章 Android 安全的其它话题 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们会涉及到与 Andro ...
- 直播美颜技术:视频美颜sdk的快速集成与开发实践
视频美颜sdk则是直播美颜技术的重要组成部分,它可以帮助开发者快速集成美颜功能,实现直播美颜.目前已经被广大平台.主播.平台用户所应用,在近几年甚至成了一个极其热门的讨论话题,毕竟它与人们的日常拍摄生 ...
- 计算机网络技术原理文献,计算机类毕业论文参考文献汇总
计算机类毕业论文参考文献汇总 文后参考文献是论著的必要组成部分,下面是CN人才网为大家整理的计算机类毕业论文参考文献汇总,欢迎参考~ 计算机类毕业论文参考文献 1. 张公忠,现代网络技术教程,电子工业 ...
- android flutter 混合开发,Flutter(六)Android与Flutter混合开发(Hybird)
因为笔者本身主要从事是Android开发,所以很多角度都是作为一个Android开发者学习Flutter的角度出发,IOS或者H5的开发同学可以选择性阅读 目录 前言 如果我们目前的项目是Androi ...
- Android Programming The Big Nerd Ranch Guide,Second Edition第十六章使用相机Intent部分的改进
最近自己在看这本书,看到这部分并亲手上机测试时,发现并不是照书上那样编码之后就能顺利打开相机拍照.经过思考和对比发现: photoFile文件的转化uri部分编写的不合理.原因:如果运行设备的系统版本 ...
- 第六章 Android应用的生命周期
应用程序的生命周期: Android系统决定一个进程生命周期的主要因素包括: 1.系统当前剩余多少可用内存--内存不足时,杀死一些进程释放内存 2.该进程对于用户的重要性--优先杀死对用户不重要的进程 ...
- android应用程序开发答案,第1章 Android概述--1.2 Android程序【含答案】 Android应用开发基础...
(1)单选题 1 Android程序启动最先加载AndroidManifest.xml文件,如果有多个Activity,请问()属性决定了Activity最先被加载? A android.inten ...
最新文章
- 中国投稿第一!ACL2021开幕,历届最大审稿团,预训练刷屏
- Netty 高性能之道 - Recycler 对象池的复用
- 如何把后台返回数据的根据某个选项去重新排序?
- java media_unmount file_(20120801)android文件的读写SD卡总结
- Tomcat 7.0~10.0zip版,安装版,其他一键式全部下载
- C/C++中extern的用法 ?
- PHP Smarty变量调节器
- php-fpm初始化失败,FPM的初始化 - [ PHP7的内核剖析 ] - 在线原生手册 - php中文网
- H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式
- QQ空间无法上传多张图片解决方案
- httplistener java_Java监听器Listener使用详解
- InVEST实践与进阶及在生态系统服务供需、固碳、城市热岛、论文写作
- Excel VBA与VSTO基础实战指南 VBA和VSTO权威教材
- kindle导出笔记html,手把手教你导出kindle笔记链接Evernote
- idea中项目文件颜色含义
- matlab for循环与subs应用 求解
- java画五角星_java 画五角星 填充五角星
- [Mysql] 防御和检查SQL注入攻击的手段
- 杭电OJ第11页2075~2079算法题(C语言)
- 学计算机专业选i5四核还是6核,计算机CPU的4核和6核有什么区别?