上一篇文章介绍了动态修改3D人脸模型的顶点要注意的问题。
结合人脸检测技术,根据人脸关键点实时修改顶点坐标,就能让3D人脸模型跟随自己的面部变化了。
这时候如果想让3D人脸模型换一张脸呢?
其中一种方式就是根据旧的贴图,用Photoshop调整新的贴图的五官位置:

给人脸模型替换新的贴图后,实现的效果如下:

对于非人脸的素材,比如上面这只狮子的脸,可能只能这么做。
不过对于同样是人脸的素材,则不必依靠P图,可以通过代码实现动态“换脸”。

贴图坐标的定义

为了实现换脸,首先需要了解模型的贴图坐标是如何定义的。
用文本编辑器打开Obj模型文件,找到以“f”开头的行:

···省略
f 23/1/1 21/2/1 31/3/1
f 23/1/2 24/4/2 21/2/2
f 24/4/3 25/5/3 21/2/3
f 25/5/4 26/6/4 21/2/4
f 21/2/5 26/6/5 6/7/5
···省略

上一篇文章有提到过,f后面每行有三组数字。每组的第一个数字是顶点坐标的序号,第二个数字是贴图坐标的序号。
之前介绍如何修改人脸模型左眼角的顶点坐标时,已经知道左眼角的顶点坐标序号是21。
从上面的几组数字中,找到以21为开头的一组,看到21斜杠后面是2。
意思就是序号为21的顶点坐标,对应序号为2的贴图坐标。

再找到以”vt”开头的行:

···省略
vt 0.2147 0.6968
vt 0.3233 0.6276
vt 0.3213 0.7244
vt 0.2208 0.5305
vt 0.2612 0.3763
···省略

“vt”开头的行定义的就是贴图坐标。
找到第二行:

vt 0.3233 0.6276

用Photoshop打开这张贴图,拉出标尺看就明白了:

因此“换脸”,或者说替换人脸贴图,其实就是用人脸检测技术,获取新的人脸素材的关键点位置,再用新的关键点替换对应的贴图坐标。
具体如何操作,请参阅项目中的LandmarkUtils。

Rajawali中替换模型贴图

内置于APP中的Obj模型文件放在res/raw目录中,其贴图素材放在res/drawable-nodpi目录中。
由于我们的“换脸”方案需要修改Obj模型文件的内容,为便于处理,将Obj模型文件复制到SD卡中。
加载SD卡中的模型文件,与加载内置的模型文件有些区别,代码如下:

protected void initScene() {try {// 加载SD卡中的人脸模型// objPath是模型文件的路径String objPath = "xxx";LoaderOBJ parser = new LoaderOBJ(this, objPath);parser.parse();Object3D faceModel = parser.getParsedObject();// 添加模型到场景中        getCurrentScene().addChild(faceModel);} catch (ParsingException e) {e.printStackTrace();}
}

注意上面的objPath,假如模型文件的路径是/sdcard/Obj/faceModel_obj,那么objPath写“Obj/faceModel_obj”就可以了。
因为LoaderOBJ方法最后调用的是:

public ILoader parse() throws ParsingException {if (mFile == null && mFileOnSDCard != null)mFile = new File(Environment.getExternalStorageDirectory(), mFileOnSDCard);if (mFile != null && RajLog.isDebugEnabled())RajLog.d("Parsing: " + mFile.getAbsolutePath());return this;
}

这个mFileOnSDCard就是上面的objPath。
之前一时疏忽写成objPath = Environment.getExternalStorageDirectory() + “Obj/faceModel_obj”,导致报错说找不到模型文件。

接下来就是替换贴图,修改上面的代码:

// ...省略
Object3D faceModel = parser.getParsedObject();
ATexture texture = faceModel.getMaterial().getTextureList().get(0);
// 先移除旧的贴图
faceModel.getMaterial().removeTexture(texture);
// 读取新的贴图素材
String newTexture = "xxx";
Bitmap bitmap = BitmapFactory.decodeFile(newTexture);
// 替换新的贴图
faceModel.getMaterial().addTexture(new Texture("canvas", bitmap));

替换新贴图之前,还可以对bitmap做一些处理,比如调整人脸的肤色,让“换脸”效果更自然:

左边是调整前,右边是调整后,目前调肤色效果还不太理想,暂时就不介绍了。

AR Camera开发记录(三) -- 替换人脸贴图相关推荐

  1. AR Camera开发记录(二) -- 3D人脸模型

    转载:https://blog.csdn.net/torchlight2012/article/details/76066790 在 AR Camera开发记录(一) – Rajawali的使用末尾的 ...

  2. 跨平台AR增强现实开发(三)(ARCamera功能与简介)

    简介 ARCamera渲染AR场景的相机,只要使用AR功能必须要用到:我使用的是vuforia 5.5.9的版本,改版本全面支持微软的hololens,支持市面上的各种主流VR眼镜 绑定类 Vufor ...

  3. STM32开发记录三: 硬件IIC调试(STHC3温湿度传感器)

    一.STM32_CubeMX配置 /* I2C4 init function */ void MX_I2C4_Init(void) {hi2c4.Instance = I2C4;hi2c4.Init. ...

  4. 微信小程序java后端开发记录(三):模板消息推送

    ·模板消息推送 1.1推送参数dto: 按照文档逐层次封装请求参数. 这些参数 /*** @author hanyy* @Description: 微信小程序模板消息推送参数* @date 2019/ ...

  5. Android 百度地图开发(三)--- 实现比例尺功能和替换自带的缩放组件

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/11821523 貌似有些天没有写博客了,前段时间在忙找工作的事,面试了几家公司,表示反响 ...

  6. 三.开发记录之移动硬盘装ubuntu系统的配置、环境、各类软件安装和备份等

    专栏系列文章如下: 一.开发记录之AHRS.惯导传感器SBG-Ellipse-N传感器配置和使用_goldqiu的博客-CSDN博客 二.开发记录之派勤工控机远程使用和ubuntu和ROS环境配置_g ...

  7. unity+高通vuforia开发增强现实(AR)教程(三)

    前段时间忙公司的事,好久没到CSDN来了,看到教程有这么多人参考,决心再接再厉,这篇教程就讲讲怎么做video形式的增强现实.(自己做了个案例,少女时代著名的甩大腿舞戳我O(∩_∩)O) 高通的SDK ...

  8. Android camera(4)---Android Camera开发之基础知识篇

    Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...

  9. AR.js开发问题详解(二维码识别不出来及AR二维码如何进行训练)

    AR.js开发问题详解(二维码识别不出来及AR二维码如何进行训练) 1.      大家碰到的很多都是二维码识别不出来的情况. 原因:周围环境的光太强或太暗,遮挡了二维码的信息,摄像头识别不到全部的信 ...

  10. 开发物体识别桌、_【课程总结】AR系统开发“秘籍”大揭秘!

    导读:AR技术飞速发展,被广泛应用于游戏.医疗.旅游.电商等行业.那么对于AR系统的整体设计和应用是如何操作的呢?商汤泰坦公开课第006期联合"SLAM技术及应用"暑期学校与研讨会 ...

最新文章

  1. ASP.NET中常用的几个李天平开源公共类LTP.Common,Maticsoft.DBUtility,LtpPageControl
  2. Android之AsyncTask源码解析
  3. 用python画猫咪怎么画-如何用Python实现可视化地图
  4. golang经典书籍--Go语言实战
  5. 数据库中字段类型对应的C#中的数据类型
  6. 【AutoML】强化学习如何用于模型蒸馏?
  7. wxWidgets:wxGridEditorCreatedEvent类用法
  8. VueX的store的简单使用心结
  9. python3和python2 优势_python3和python2的区别
  10. 【java笔记】成员内部类 局部内部类 匿名内部类
  11. [转载] Python大数据文本分析及应用
  12. php.ini gd_php安装gd扩展
  13. JAVA等差素数列蓝桥杯_等差素数列(2017蓝桥杯,二题 )
  14. 列表套字典三者匹配对应关系
  15. 英语 名词复数的变化及其发音
  16. centos7 定时清理内存
  17. 同样是学编程,为什么别人十几岁就成了黑客,而你还在做码农
  18. Unity3D 动态加载资源方式
  19. 经典垃圾收集器(三)
  20. 如何在word里里面打勾

热门文章

  1. Cadence软件包集成了那么多软件,傻傻分不清?
  2. 文件传输-FTP使用简介
  3. KITTI 数据集简介
  4. JavaScript基础
  5. vs2013和vs2015密钥
  6. android vue 编辑器,vue vlog下载 vue vlog(视频制作软件) for Android v3.16.3 安卓版 下载-脚本之家...
  7. 小米路由插件二维码2020_入门级Mesh首选?华来小方Mesh路由深度解析
  8. 【2021 年 MathorCup 高校数学建模挑战赛—赛道A二手车估价问题】2 问题一 数据预处理、特征工程及模型训练Baseline 和数据
  9. vivado软件安装教程
  10. Python 使用pip下载失败的解决方案