前言

直播、短视频、在线会议等应用越来越多地进入人们的生活,随之诞生的是丰富的各类创意玩法与新鲜体验,其中大量应用了以AI检测和图形渲染为基础的AR技术。

而随着Web技术的不断成熟,AR技术在Web上的实现成为了一种可能。今天就总结了在Web端实现此功能的几个技术要点,跟大家一起探讨一下。

架构和概念

抽象整体的实现思路如下

调取Camera获得相机画面

使用tensorflow加载人脸识别模型生成FaceMesh

根据FaceMesh生成三角网格并进行UV贴图

FaceMesh

MediaPipe Face Mesh是一种脸部几何解决方案,即使在移动设备上,也可以实时估计468个3D脸部界标。它采用 机器学习 (ML)来推断3D表面几何形状,只需要单个摄像机输入,而无需专用的深度传感器。该解决方案利用轻量级的模型架构以及整个管线中的GPU加速,可提供对实时体验至关重要的实时性能。

UVMap

UV是二维纹理坐标,U代表水平方向,V代表垂直方向。UV Map用来描述三维物体表面与图像纹理(Texture) 的映射关系,有了UV Map,我们就可以将二维的图像纹理粘贴到三维的物体表面。

矩形贴图和球面的映射图

技术实现

调取Camera获得相机画面

通过navigator.mediaDevices.getUserMedia获取stream,放到video查看。

async function setupWebcam() {return new Promise( ( resolve, reject ) => {const webcamElement = document.getElementById( "webcam" );const navigatorAny = navigator;navigator.getUserMedia = navigator.getUserMedia ||navigatorAny.webkitGetUserMedia || navigatorAny.mozGetUserMedia ||navigatorAny.msGetUserMedia;if( navigator.getUserMedia ) {navigator.getUserMedia( { video: true },stream => {webcamElement.srcObject = stream;webcamElement.addEventListener( "loadeddata", resolve, false );},error => reject());}else {reject();}});
}
复制代码

人脸识别

//创建模型
createModel() {return new Promise(async resolve => {await tf.setBackend('webgl')const model = faceLandmarksDetection.SupportedModels.MediaPipeFaceMesh;const detectorConfig = {maxFaces: 1, //检测到的最大面部数量refineLandmarks: true, //可以完善眼睛和嘴唇周围的地标坐标,并在虹膜周围输出其他地标runtime: 'mediapipe',solutionPath: 'https://unpkg.com/@mediapipe/face_mesh', //WASM二进制文件和模型文件所在的路径};this.model = await faceLandmarksDetection.createDetector(model, detectorConfig);resolve(this.model);})
},
//识别
async recognition() {try {const video = this.$refs.video;const faces = await this.model.estimateFaces(video, {flipHorizontal: false, //镜像});if (faces.length > 0) {const keypoints = faces[0].keypoints;this.render3D({scaledMesh:keypoints.reduce((acc, pos) =>{acc.push([pos.x,pos.y,pos.z])return acc}, [])});}else{this.render3D({scaledMesh:[]})}} catch (error) {console.log(error);}
}
复制代码

3D场景贴图

  1. TRIANGULATION
  2. UV_COORDS
    //3D场景const scene = new THREE.Scene();//添加一些光照scene.add( new THREE.AmbientLight( 0xcccccc, 0.4 ) );camera.add( new THREE.PointLight( 0xffffff, 0.8 ) );//正交相机scene camera = new THREE.PerspectiveCamera( 45, 1, 0.1, 2000 );camera.position.x = videoWidth / 2;camera.position.y = -videoHeight / 2;camera.position.z = -( videoHeight / 2 ) / Math.tan( 45 / 2 )scene.add( camera ); //渲染器const renderer = new THREE.WebGLRenderer({canvas: document.getElementById( "overlay" ),alpha: true});//创建geometry,将468个人脸特征点按照一定的顺序(TRIANGULATION)组成三角网格,并加载UV_COORDSconst geometry = new THREE.BufferGeometry()geometry.setIndex(TRIANGULATION)geometry.setAttribute('uv', new THREE.Float32BufferAttribute(UV_COORDS.map((item, index) => index % 2 ? item : 1 - item), 2))geometry.computeVertexNormals()//创建materialconst textureLoader = new THREE.TextureLoader();const meshImg = this.meshList[meshIndex].src;//材质图片地址textureLoader.load(meshImg,texture=>{texture.encoding = THREE.sRGBEncodingtexture.anisotropy = 16const material = new THREE.MeshBasicMaterial({map: texture,transparent: true,color: new THREE.Color(0xffffff),reflectivity: 0.5});const mesh = new THREE.Mesh(geometry, material)scene.add(mesh)})// 根据face mesh实时更新geometryupdateGeometry(prediction){let w = canvasWidth;let h = canvasWidth;const faceMesh = resolveMesh(prediction.scaledMesh, w, h)const positionBuffer = faceMesh.reduce((acc, pos) => acc.concat(pos), [])geometry.setAttribute('position', new THREE.Float32BufferAttribute(positionBuffer, 3))geometry.attributes.position.needsUpdate = true}resolveMesh(faceMesh, vw, vh){return faceMesh.map(p => [p[0] - vw / 2, vh / 2 - p[1], -p[2]])}//渲染render3D(prediction){if (prediction) {updateGeometry(prediction)}renderer.render(scene, threeCamera)}
复制代码

加载3D模型

//加载3D模型
const loader = new GLTFLoader();
const Object3D = new THREE.Object3D();
loader.load(modelUrl, (gltf) => {const object = gltf.sceneconst box = new THREE.Box3().setFromObject(object)const size = box.getSize(new THREE.Vector3()).length()const center = box.getCenter(new THREE.Vector3())object.position.x += (object.position.x - center.x);object.position.y += (object.position.y - center.y + 1);object.position.z += (object.position.z - center.z - 15);Object3D.add(object)this.scene.add(Object3D)
})//计算Matrix
const position = prediction.midwayBetweenEyes[0]
const scale = this.getScale(prediction.scaledMesh, 234, 454)
const rotation = this.getRotation(prediction.scaledMesh, 10, 50, 280)
object.position.set(...position)
object.scale.setScalar(scale / 20)
object.scale.x *= -1
object.rotation.setFromRotationMatrix(rotation)
object.rotation.y = -object.rotation.y
object.rotateZ(Math.PI)
object.rotateX(-Math.PI * .05)
if (this.morphTarget) {// flippedthis.morphTarget['leftEye'] && this.morphTarget['leftEye'](1 - prediction.faceRig.eye.r)this.morphTarget['rightEye'] && this.morphTarget['rightEye'](1 - prediction.faceRig.eye.l)this.morphTarget['mouth'] && this.morphTarget['mouth'](prediction.faceRig.mouth.shape.A)
}

web端实现AR人脸特效相关推荐

  1. 技术实践 | Web 端实现 RTC 视频特效的解决方案

    导读:Web 是否真的无法享受到原生那样高效丰富的视频处理?是否有我们未知的黑科技能提升 Web 的 RTC 使用体验?我们决定针对 Windows 的浏览器来展开一番探究. 文|金杰 网易云信客户端 ...

  2. Web 端实现 RTC 视频特效的解决方案

    需求 随着 RTC 技术的发展,音视频通讯的门槛降到了一个极低的标准.移动端.PC 端.Web 端.小程序,随手拿起一个设备就可以完成高质量的音视频通话.而且伴随着移动互联网的发展(4G,5G),AI ...

  3. 基于腾讯云实时音视频(TRTC)的web端 多人人脸识别小游戏

    场景介绍 一个双人视频互动的小游戏, 连接后,可以实时看到对方的视频情况, 根据对方的视频情况实时进行游戏操作 摇头进行控制挡板 不让球掉落. 眨眼发球. 准备工作 获取应用 SDKAppID 和 应 ...

  4. 实时风格迁移,移动端运行,人脸特效又有了新玩法

    视学算法报道 转载自:机器之心 编辑:维度 人脸风格迁移出现新玩法!捷克理工大学联合 Snap 公司创建了一个用于视频中人脸风格实时迁移的框架,既不需要大型数据集和冗长训练周期,更能够在移动端运行. ...

  5. 身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」

    作者:沫沫 政采云前端团队 转发链接:https://mp.weixin.qq.com/s/fRDpXixnLIy9c0Uh2tMezQ 前言 近些年来,随着生物识别技术的逐渐成熟,基于深度学习的人脸 ...

  6. OpenCV-Python实战(21)——OpenCV人脸检测项目在Web端的部署

    OpenCV-Python实战(21)--OpenCV人脸检测项目在Web端的部署 0. 前言 1. OpenCV 人脸检测项目在 Web 端的部署 1.1 解析请求并构建响应 1.2 构建请求进行测 ...

  7. 基于 Web 端的人脸识别身份验证

    效果展示 人脸识别效果图 前言 近些年来,随着生物识别技术的逐渐成熟,基于深度学习的人脸识别技术取得了突破性进展,准确率显著提高.现阶段,人脸识别身份验证作为非常重要的身份验证方式,已被广泛的应用于诸 ...

  8. 毕业设计---基于人脸识别的Web端考勤系统

    一,前景摘要 1.1,背景简介 本文是对自己的毕业设计项目做一个综合性的归纳,涉及了一些重要板块的编程代码. 是一个基于web端的人脸识别项目,希望有相关需要的同学可以从中得到收获. 由于只在大二时粗 ...

  9. 增强现实技术(AR)在Web端的技术原理

    鉴于Web技术的最新进展,在开发基于AR的解决方案时,它提供了一组新的选择.网络浏览器的最新更新为AR的应用打开了大门.使用Web或本地应用程序构建AR体验更好吗?在本文中,我将简要概述JS在本机应用 ...

最新文章

  1. python编写通讯录管理系统_一个简单的python程序实例(通讯录)
  2. 《用Python进行自然语言处理》第 4 章 编写结构化程序
  3. 构建之法 第6~7章读后感和对Scrum的理解
  4. vue本地项目静态资源管理
  5. Tkinter的listbox组件
  6. UPX脱壳全程分析(转)
  7. 岛屿数量—leetcode200
  8. linux环境下ntp客户端,多种操作系统NTP客户端配置
  9. javascript operators(操作符)
  10. Linux安装Django
  11. myeclipse导出war包出错Security alert解决办法
  12. oracle异步备份,网络存储导论第七章:异步数据复制容灾方式
  13. PHP 的oop思想
  14. 这几个好用的简单流程图模板,你可不能错过
  15. 计算机高级筛选在哪找,excel表格数据高级筛选在哪里-EXCEL高级筛选
  16. [转] PHP开发通用型标题图片功能
  17. 国内百兆独立服务器哪里的比较便宜镇江电信好吗
  18. kallsyms_lookup_name使用简介
  19. 用AI「复活」逝者:「深度怀旧」项目火遍推特,我们也用民国老照片试了下 #蚂蚁呀嘿
  20. rono在oracle的作用_Oracle中存储过程的作用和用法

热门文章

  1. 关于移动广告平台,你不知道的那些事
  2. 用opencv将图片转换为漫画风格
  3. ACIS内核和parasolid内核的来龙去脉与比较
  4. 【bzoj 2073】PRZ(状压DP)
  5. 安卓开发团队 CM团队和MIUI团队的介绍
  6. 开题报告之修改意见和心得体会(下)
  7. 【MongoDB 6.0】MongoInvalidArgumentError: Update document requires atomic operators
  8. Linux下的用户与用户组管理命令(含上机作业)
  9. 好莱坞洞穴重现“小宇宙”,投影技术创造极致体验
  10. 常见的 GC 算法介绍(Parallel/CMS/G1):温故而知新