最近笔者遇到一个问题就是openpose在对于姿态识别的时候,识别出的人体姿态是一个2d平面姿态。对于AR交互应用来说,2d姿态是不如3d姿态的。当然可以使用kinect深度摄像头或者开源项目vnect实现3d的实时姿态识别。但是如果能够对于openpose做一些改动,可以达到近似的效果。

首先openpose的body_25模型输出如图:

为了做出一个近似效果 ,我们可以先假定
1.躯干是面对摄像头不会偏移(旋转的)【关节点 5 2 1 8】。
2. 肢体的倾斜只有左倾 右倾 和 前倾 , 没有向后倾。
然后首先我们的目标是做一个如图上的伸展姿势(肢体在2d平面内),测定每块肢体的长度。

接下来 ,我们以 1 2 和 2 3 关节点为例,做一个3d姿态识别。
首先我们假定了 5 2 1 8 始终与摄像头保持平行,所以可以以此为参照。

对于2d平面来说 这个角度我们是已知的,可以通过计算向量之间的夹角得出。
那么当3进行前倾的时候, 得到的2d 输出其实是 2 3'。我们已知 2 3'的长度和 2 3的长度。
2 3' = 2 3 * cos Θ。 这样可以计算得出 前倾角θ的角度。得到了 两张图中的角度 ,即可得到关节点3的空间位置

对于OpenPose的unity插件而言,是将得到的姿态信息在屏幕上进行标定,然后使用LineRenderer进行绘制。笔者在此基础上添加了肢体模型


脚本在lsfather lsfather为空物体 lshoulder为实际模型,这样方便于角度和模型的调校。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class To3DBlog : MonoBehaviour
{[SerializeField] RectTransform Joint0;[SerializeField] RectTransform Joint1;Vector3 direction;bool enabledstate;GameObject Renderobj;[SerializeField]  float MaxSize = 0;[SerializeField]  float curLength;float curHeight;[SerializeField] GameObject childobj;// Start is called before the first frame updatevoid Start(){Renderobj = this.gameObject;childobj = this.gameObject.transform.GetChild(0).gameObject;}// Update is called once per framevoid Update(){if (Joint0 && Joint1){bool enabled = Joint0.gameObject.activeInHierarchy && Joint1.gameObject.activeInHierarchy;enabledstate = enabled;childobj.SetActive(enabled);if (enabled){//进行direction = (Joint0.transform.localPosition - Joint1.transform.localPosition);curLength = direction.magnitude;//向量的模if (curLength > MaxSize){MaxSize = direction.magnitude;}//求Joint1 的 z 值//curHeight = MaxSize * Mathf.Sin(Mathf.Acos(curLength/MaxSize));curHeight = Mathf.Sqrt(Mathf.Pow(MaxSize,2)- Mathf.Pow(curLength,2));//面前方向是 -z 轴方向 但是 考虑镜像 direction = (Joint1.transform.localPosition + new Vector3(0, 0, curHeight) - Joint0.transform.localPosition);Renderobj.transform.localPosition = (Joint1.transform.localPosition + Joint0.transform.localPosition + new Vector3(0,0,-curHeight)) / 2;Renderobj.transform.up = direction;Renderobj.transform.localScale = new Vector3(MaxSize, MaxSize, MaxSize);//scale的问题}}}
}

算法解释如图:其中curLength 是openpose识别出两个关节点间的距离(也是该肢体在z轴的投影),MaxSize是该肢体实际长度,以此可以求出当前Joint1的高度。

对于右肩适用结果

对于右手臂适用结果 左2d 右3d 效果如图

Openpose2d转换3d姿态识别相关推荐

  1. 保姆级解读!CSS属性transform变形+2D转换+3D转换实例+代码+解析——Web前端系列学习笔记

    文章目录 transfrom 2D转换 案例代码 效果图 元素变形原点 3D转换 3D转换--案例 案例代码 transfrom transform,翻译成中文的含义是"改变,使-变形:转换 ...

  2. 浅学一点空间转换3D和动画知识

    一 . 空间转换3D 3D坐标系 3D坐标系比2D多了一个Z轴. 一定要记住3个坐标轴取值的正反: X 轴 往右越大,是正值, 否则反之 Y 轴 往下越大,是正值,否则反之 Z轴 (指向我们)越大,是 ...

  3. 【css3文字阴影+盒子阴影+过渡+2d转换+3d转换】

    文字阴影text-shadow text-shadow 后面的值有4个: 第一个:X轴,水平阴影位置 允许负值. ​ 第二个:y轴,垂直阴影位置,允许负值. ​ 第三个:blur, 模糊的距离 ​ 第 ...

  4. CSS 空间转换3D和动画

    空间转换3D 3D坐标系 一定要记住3个坐标轴取值的正反: X 轴 往右越大,是正值, 否则反之 Y 轴 往下越大,是正值,否则反之 Z轴 (指向我们)越大,是正值,否则反之 3D位移 完整写法 tr ...

  5. 移动web 空间转换 3D

    移动web 空间转换 3D 空间转换 3D 3D位移 透视 3D旋 rotateX rotateY 左手法则 立体呈现 空间转换 3D 3D坐标系 3D 坐标系比2D 多了一个Z轴. 一定要记住3个坐 ...

  6. 空间转换 3D; 动画(重点)

    一.空间转换 3D 1.   3D坐标系 3D 坐标系比2D 多了一个Z轴. 一定要记住3个坐标轴取值的正反: X 轴 往右越大,是正值, 否则反之 Y 轴 往下越大,是正值,否则反之 Z轴 (指向我 ...

  7. html52D转换3D,CSS3 Transform 2D和3D转换

    1.2 缩放 语法transform : scale(x,y); -webkit-transform : scale(x,y); 根据倍数来缩放,取决于宽度(X轴)和高度(Y轴)的参数:也可以用一个参 ...

  8. CSS3 2D转换3D转换

    1.transform属性方法 Transform 方法 2.2D转换 translate()方法 .div1 {width: 100px;height: 100px;background: #00f ...

  9. sketchup 图片转模型_su模型转换3d模型(如何将3D模型转化为sketchup)

    求救求救~~~3dmax模型 导入su 模型的位置变了 非得... 第一步  全部放到一个图层然后打组 第二部   随便画个box体 第三部  选择建筑点击链接变换 第四步   点击拾取 选择box体 ...

最新文章

  1. php+redis+两种驱动,redis的php驱动两种方式
  2. 成都铁路警方联合多部门开展反恐防暴演练
  3. Java实现链表结构的具体代码
  4. ASP、JSP、PHP 三种技术比较
  5. SpringBoot开源项目(企业信息化基础平台)
  6. 修改windows功能要开启哪个服务器,win7更改windows功能提示出现错误并非所有的功能被成功更改怎么办...
  7. iOS多线程开发之NSThread
  8. 如何在 Mac、iphone 中快速清除已完成的提醒?
  9. Visual Studio 远程调试设置
  10. 设计模式学习(四)工厂模式
  11. 如何学计算机打字,新手学电脑如何快速学会打字
  12. vue项目中微信分享安卓正常,ios报签名错误
  13. 前端成长之路之打好根基
  14. c++语言程序中,main()函数必须放在程序开始的部分,C++多选题(附答案)
  15. Android6.0动态获取权限java.io.FileNotFoundException: …Permission denied
  16. DHCP协议说明及报文分析
  17. Easymock十分钟入门
  18. A* 流程+代码详细注释
  19. 电影记忆之16(人工智能)
  20. hive 压缩格式汇总

热门文章

  1. azure mysql数据库_Azure上创建MySql数据库服务
  2. Android 三种拨号方式(kotlin)
  3. PLC程序案例一:喷泉电路(采用中间继电器完成分步控制)
  4. 【Java+MySQL】随机添加测试数据栗子
  5. 设计模式之禅【迭代器模式】
  6. linux检查新增文件,linux查看文件内容
  7. 亚马逊账号被关联能申诉得回来吗
  8. 让未来更近,三星The New Bixby与IoT打造智能物联
  9. 【建议珍藏】2023年最新Android大厂面经分析,最终入职得物
  10. 配置 centos yum源