首页 > 其他分享 >tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图

tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图

时间:2024-04-08 18:01:23浏览次数:30  
标签:console keyPoints js opencv window var tensorflow cv 姿态

文章目录


前言

在计算机视觉领域,估算脸部姿态是一项具有挑战性但又极具应用前景的任务。通过识别脸部特征点,我们可以了解人脸的姿态,包括旋转角度、倾斜程度等信息。本文将介绍如何利用 TensorFlow.js 和 OpenCV.js 结合起来,实现通过面部特征点估算脸部姿态并绘制示意图的功能。


一、实现步骤

本文将基于文章如何使用tensorflow.js实现面部特征点检测中实现的人脸特征点检测继续根据人脸特征点实现人脸姿态的估计和绘制。

1. 获取所需特征点的索引

我们可以从示例项目看到注释的主要特征点索引如下:
请添加图片描述

2. 使用opencv.js 计算俯仰角、水平角和翻滚角

我们可以从示例项目看到计算的相关代码如下:

 var modelPoints = window.cv.matFromArray(6, 3, window.cv.CV_32F, [
        0.0,
        0.0,
        0.0, // Nose tip
        0.0,
        -330.0,
        -65.0, // Chin
        -225.0,
        170.0,
        -135.0, // Left eye left corner
        225.0,
        170.0,
        -135.0, // Right eye right corne
        -150.0,
        -150.0,
        -125.0, // Left Mouth corner
        150.0,
        -150.0,
        -125.0, // Right mouth corner
      ]);

      var imagePoints = window.cv.matFromArray(6, 2, window.cv.CV_32F, [
        keyPoints[4].x,
        keyPoints[4].y, // Nose tip
        keyPoints[152].x,
        keyPoints[152].y, // Chin
        keyPoints[263].x,
        keyPoints[263].y, // Left eye left corner
        keyPoints[33].x,
        keyPoints[33].y, // Right eye right corne
        keyPoints[308].x,
        keyPoints[308].y, // Left Mouth corner
        keyPoints[78].x,
        keyPoints[78].y, // Right mouth corner
      ]);

      var focal_length = inputResolution.width;
      var center = [inputResolution.width / 2, inputResolution.height / 2];
      var cameraMatrix = window.cv.matFromArray(3, 3, window.cv.CV_64F, [
        focal_length,
        0,
        center[0],
        0,
        focal_length,
        center[1],
        0,
        0,
        1,
      ]);

      // console.log("Camera Matrix", cameraMatrix.data64F);

      var distCoeffs = window.cv.matFromArray(
        4,
        1,
        window.cv.CV_64F,
        [0, 0, 0, 0]
      ); // Assuming no lens distortion

      var rvec = new window.cv.Mat(3, 1, window.cv.CV_64F);
      var tvec = new window.cv.Mat(3, 1, window.cv.CV_64F);

      let ret_val = window.cv.solvePnP(
        modelPoints,
        imagePoints,
        cameraMatrix,
        distCoeffs,
        rvec,
        tvec,
        false,
        window.cv.SOLVEPNP_ITERATIVE // flags
      );

      // console.log("-------ret_val--------");
      // console.log(ret_val);
      // console.log("-------rvecs--------");
      // console.log("rvecs.data64F", rvec.data64F);
      // console.log("tvecs.data64F", tvec.data64F);

      var rtn = getEulerAngle(rvec);

      var pitch = rtn[0]; // 俯仰角
      var yaw = rtn[1]; // 水平角
      var roll = rtn[2]; // 翻滚角
      // console.log("pitch:", pitch, "yaw:", yaw, "roll:", roll);

cv.solvePnP介绍

在计算机视觉领域,解决摄像头姿态估计(Camera Pose Estimation)问题是一项关键任务。摄像头姿态估计可以用于许多应用,例如增强现实、目标跟踪和三维重建等。OpenCV是一个广泛使用的开源计算机视觉库,其中的cv.solvePnP方法是用于解决摄像头姿态估计问题的重要工具。

cv.solvePnP方法是OpenCV库中的一个函数,用于估计摄像头的姿态。该方法可以通过已知的物体三维坐标和对应的图像中的二维坐标来计算摄像头的姿态。姿态包括摄像头的旋转和平移。

cv.solvePnP原理

cv.solvePnP方法的原理基于解决一种称为PnP问题(Perspective-n-Point Problem)的几何计算。该问题旨在通过已知的三维点和它们在图像中的投影来计算摄像头的姿态。具体来说,该方法利用了摄像头的投影模型和三维-二维点对之间的几何关系。

在解决PnP问题时,cv.solvePnP方法通常使用一种称为迭代最小化重投影误差(Iterative Minimization of Reprojection Error)的技术。该技术通过最小化实际观测到的图像点和由估计的摄像头姿态计算得到的投影点之间的误差来优化姿态估计。

cv.solvePnP方法在许多计算机视觉应用中都有广泛的应用,其中包括但不限于:
增强现实(AR):用于将虚拟对象准确地叠加到实际世界中。
目标跟踪:用于追踪目标物体的位置和姿态。
三维重建:用于从多个视角的图像中重建三维场景。

运行代码查看效果

npm i安装依赖
npm start运行代码
请添加图片描述

3.绘制姿态示意直线

添加canvas元素

请添加图片描述

计算姿态直线坐标并绘制

相关代码内容如下:

var noseEndPoint2D = new window.cv.Mat(1, 2, window.cv.CV_64F);
      var jacobian = new window.cv.Mat(
        imagePoints.rows * 2,
        13,
        window.cv.CV_64F
      );
      window.cv.projectPoints(
        window.cv.matFromArray(1, 3, window.cv.CV_64F, [0.0, 0.0, 1000.0]),
        rvec,
        tvec,
        cameraMatrix,
        distCoeffs,
        noseEndPoint2D,
        jacobian
      );

      // console.log(noseEndPoint2D);

      // 绘制线段,连接鼻尖和其它点
      var p1 = new window.cv.Point(
        Math.round(imagePoints.data32F[0]),
        Math.round(imagePoints.data32F[1])
      );
      var p2 = new window.cv.Point(
        Math.round(noseEndPoint2D.data64F[0]),
        Math.round(noseEndPoint2D.data64F[1])
      );

      var zeroMat = window.cv.Mat.zeros(
        inputResolution.height,
        inputResolution.width,
        window.cv.CV_8U
      );

      // console.log("p1", p1.x, p1.y);
      // console.log("p2", p2.x, p2.y);

      window.cv.line(zeroMat, p1, p2, new window.cv.Scalar(255, 0, 0), 2);
      window.cv.imshow("cv", zeroMat);

最终的效果如下
请添加图片描述


总结

感谢您看到这里,本文介绍了如何结合tensorflow.js 和 opencv.js通过面部特征点估算脸部姿态并绘制示意图,希望对您有所帮助,如果文章中存在任何问题、疏漏,或者您对文章有任何建议,请在评论区提出。


标签:console,keyPoints,js,opencv,window,var,tensorflow,cv,姿态
From: https://blog.csdn.net/qq_41456316/article/details/137501430

相关文章

  • three.js零基础入门超全超细的教程整理(一)
    事情是这样的:有一天我干完活看技术文章发现了three.js诶!这玩应挺有意思盘盘于是第一天找教程上官网初上手第二天找案例渲模型试VR第三天捋文档然后来活了没时间捋了下面是集百家精华教程的整理总结涉及到教程方面有加源作者和地址超详细的教程:http://ww......
  • JS--demo2录入学生信息
    实现学生信息录取。效果图:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><metahttp-equiv=&quo......
  • Node.js安装教程
    1.Node.jsNode.js是什么?我们知道,js通常情况下是基于浏览器运行的,那如果脱离了浏览器,该如何运行js呢?这就需要Node.js了。2.下载与安装下载下载地址:https://nodejs.org/en/download以windows为例,有安装版和免安装版。1号位置是官方推荐的最新版本:https://nodejs.org/dis......
  • JS中时间对象与时间的格式化
    newDate("2024-04-08T00:00:00")//输出MonApr08202400:00:00GMT+0800(中国标准时间)时间是正常的,没有多出来8个小时newDate("2024-04-0800:00:00")//输出MonApr08202400:00:00GMT+0800(中国标准时间)时间是正常的,没有多出来8个小时newDate()//MonAp......
  • NestJS 基础概念
     1.ModuleModule是NestJS的基本组织单位。模块系统基于Node.js的CommonJS模块系统,但提供了更高级别的抽象和组织方式。通过使用模块,你可以将应用程序拆分成多个独立且可复用的部分,每个模块都负责实现特定的功能或业务逻辑。模块可以封装相关的代码、配置和依赖关系,使得......
  • Chrome浏览器前端开发调试时强制更新js、css静态资源文件缓存的方法
    以Chrome浏览器为例,国产浏览器未做全面测试。前端开发静态文件时,浏览器访问会缓存样式、图片、js等,怎么快速更新缓存。以下方法特别适合只想清除某个网页的缓存,而不想清除全部浏览器缓存可以采用以下方法。一、强制刷新同时按住ctrl+f5或ctrl+shift+r进行访问页面强制刷新,一般......
  • 毕业设计jsp 手办周边商城
    摘要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,手办周边商城当然也不能排除在外。手办周边商城是以实际运用为开发背景,运用软件工程开发方法,采用jsp技术构建的一个管理系统。整个开发过程首先对软件系统进......
  • 毕业设计jspm贝儿米幼儿教育管理系统
    摘要随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。贝儿米幼儿教育管理系统,主要的模块包括查看;管理员;个人中心、用户管理、学生信息管理、班级信息管理、缴费信息管理、幼儿园信息管理、教师信息管理、考勤......
  • 毕业设计jspm宠物医院信息管理系统
    摘要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对宠物医院信息管......
  • 毕业设计jspm少儿编程教育网站系统
    摘要在国家重视教育影响下,教育部门的密确配合下,对教育进行改革、多样性、质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础,设计一个快捷而又方便的网上少儿编程教育网站系统是一项十分重要并且有价值的事情。对于传统的少儿编程教育网站......