美妆介绍

美颜类相机中一般会有彩妆功能,彩妆基本上都是贴图实现,这跟动态贴纸的贴图又不一样,动态贴纸的贴图一般是通过对贴纸进行透视变换实现的。

美妆分类

美妆主要包括唇彩、腮红、眼影、眼线、双眼皮、美瞳、眉毛、阴影修容等处理。具体的思路如下:

唇彩

唇彩功能,一般是通过遮罩来处理的。嘴巴的遮罩图三角剖分如下所示:

唇彩遮罩三角剖分

对应的关键点三角剖分如下:

唇彩三角剖分

通过遮罩得到嘴唇的位置之后,经过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 美妆定制实现...相关推荐

  1. 《Android 美颜类相机开发汇总》第五章 Android OpenGLES 美颜定制实现

    在介绍美颜定制之前,我们先来复习一下OpenGL中图像绘制原理.OpenGL的图像绘制,是由许许多多三角形构成的.OpenGL的绘制离不开三角形的绘制.通常对于不需要对图像细节进行处理的时候,我们一般 ...

  2. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧...

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息 屏幕大小:屏幕对角线长度,单位"寸": 分辨率:手机屏幕像素点个数,例如720x1280分辨率: PPI(Pixels ...

  3. 浅入浅出 Android 安全:第六章 Android 安全的其它话题

    第六章 Android 安全的其它话题 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们会涉及到与 Andro ...

  4. 直播美颜技术:视频美颜sdk的快速集成与开发实践

    视频美颜sdk则是直播美颜技术的重要组成部分,它可以帮助开发者快速集成美颜功能,实现直播美颜.目前已经被广大平台.主播.平台用户所应用,在近几年甚至成了一个极其热门的讨论话题,毕竟它与人们的日常拍摄生 ...

  5. 计算机网络技术原理文献,计算机类毕业论文参考文献汇总

    计算机类毕业论文参考文献汇总 文后参考文献是论著的必要组成部分,下面是CN人才网为大家整理的计算机类毕业论文参考文献汇总,欢迎参考~ 计算机类毕业论文参考文献 1. 张公忠,现代网络技术教程,电子工业 ...

  6. android flutter 混合开发,Flutter(六)Android与Flutter混合开发(Hybird)

    因为笔者本身主要从事是Android开发,所以很多角度都是作为一个Android开发者学习Flutter的角度出发,IOS或者H5的开发同学可以选择性阅读 目录 前言 如果我们目前的项目是Androi ...

  7. Android Programming The Big Nerd Ranch Guide,Second Edition第十六章使用相机Intent部分的改进

    最近自己在看这本书,看到这部分并亲手上机测试时,发现并不是照书上那样编码之后就能顺利打开相机拍照.经过思考和对比发现: photoFile文件的转化uri部分编写的不合理.原因:如果运行设备的系统版本 ...

  8. 第六章 Android应用的生命周期

    应用程序的生命周期: Android系统决定一个进程生命周期的主要因素包括: 1.系统当前剩余多少可用内存--内存不足时,杀死一些进程释放内存 2.该进程对于用户的重要性--优先杀死对用户不重要的进程 ...

  9. android应用程序开发答案,第1章 Android概述--1.2 Android程序【含答案】 Android应用开发基础...

    (1)单选题 1 Android程序启动最先加载AndroidManifest.xml文件,如果有多个Activity,请问()属性决定了Activity最先被加载? A  android.inten ...

最新文章

  1. 中国投稿第一!ACL2021开幕,历届最大审稿团,预训练刷屏
  2. Netty 高性能之道 - Recycler 对象池的复用
  3. 如何把后台返回数据的根据某个选项去重新排序?
  4. java media_unmount file_(20120801)android文件的读写SD卡总结
  5. Tomcat 7.0~10.0zip版,安装版,其他一键式全部下载
  6. C/C++中extern的用法 ?
  7. PHP Smarty变量调节器
  8. php-fpm初始化失败,FPM的初始化 - [ PHP7的内核剖析 ] - 在线原生手册 - php中文网
  9. H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式
  10. QQ空间无法上传多张图片解决方案
  11. httplistener java_Java监听器Listener使用详解
  12. InVEST实践与进阶及在生态系统服务供需、固碳、城市热岛、论文写作
  13. Excel VBA与VSTO基础实战指南 VBA和VSTO权威教材
  14. kindle导出笔记html,手把手教你导出kindle笔记链接Evernote
  15. idea中项目文件颜色含义
  16. matlab for循环与subs应用 求解
  17. java画五角星_java 画五角星 填充五角星
  18. [Mysql] 防御和检查SQL注入攻击的手段
  19. 杭电OJ第11页2075~2079算法题(C语言)
  20. 学计算机专业选i5四核还是6核,计算机CPU的4核和6核有什么区别?

热门文章

  1. 硬核科普:到底啥是云原生?
  2. 大数据调度平台Airflow(五):Airflow使用
  3. 客快物流大数据项目(四十六):Spark操作Kudu dataFrame操作kudu
  4. 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)
  5. Python案例:使用XPath的爬虫
  6. Django 视图函数
  7. Python 把列表转成元组
  8. New Android Application 的介绍
  9. ARM Linux 基于S3C2451的AD9833波形发生器/Linux字符驱动的理解
  10. nodejs 各种插件