Openpose2d转换3d姿态识别
最近笔者遇到一个问题就是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姿态识别相关推荐
- 保姆级解读!CSS属性transform变形+2D转换+3D转换实例+代码+解析——Web前端系列学习笔记
文章目录 transfrom 2D转换 案例代码 效果图 元素变形原点 3D转换 3D转换--案例 案例代码 transfrom transform,翻译成中文的含义是"改变,使-变形:转换 ...
- 浅学一点空间转换3D和动画知识
一 . 空间转换3D 3D坐标系 3D坐标系比2D多了一个Z轴. 一定要记住3个坐标轴取值的正反: X 轴 往右越大,是正值, 否则反之 Y 轴 往下越大,是正值,否则反之 Z轴 (指向我们)越大,是 ...
- 【css3文字阴影+盒子阴影+过渡+2d转换+3d转换】
文字阴影text-shadow text-shadow 后面的值有4个: 第一个:X轴,水平阴影位置 允许负值. 第二个:y轴,垂直阴影位置,允许负值. 第三个:blur, 模糊的距离 第 ...
- CSS 空间转换3D和动画
空间转换3D 3D坐标系 一定要记住3个坐标轴取值的正反: X 轴 往右越大,是正值, 否则反之 Y 轴 往下越大,是正值,否则反之 Z轴 (指向我们)越大,是正值,否则反之 3D位移 完整写法 tr ...
- 移动web 空间转换 3D
移动web 空间转换 3D 空间转换 3D 3D位移 透视 3D旋 rotateX rotateY 左手法则 立体呈现 空间转换 3D 3D坐标系 3D 坐标系比2D 多了一个Z轴. 一定要记住3个坐 ...
- 空间转换 3D; 动画(重点)
一.空间转换 3D 1. 3D坐标系 3D 坐标系比2D 多了一个Z轴. 一定要记住3个坐标轴取值的正反: X 轴 往右越大,是正值, 否则反之 Y 轴 往下越大,是正值,否则反之 Z轴 (指向我 ...
- html52D转换3D,CSS3 Transform 2D和3D转换
1.2 缩放 语法transform : scale(x,y); -webkit-transform : scale(x,y); 根据倍数来缩放,取决于宽度(X轴)和高度(Y轴)的参数:也可以用一个参 ...
- CSS3 2D转换3D转换
1.transform属性方法 Transform 方法 2.2D转换 translate()方法 .div1 {width: 100px;height: 100px;background: #00f ...
- sketchup 图片转模型_su模型转换3d模型(如何将3D模型转化为sketchup)
求救求救~~~3dmax模型 导入su 模型的位置变了 非得... 第一步 全部放到一个图层然后打组 第二部 随便画个box体 第三部 选择建筑点击链接变换 第四步 点击拾取 选择box体 ...
最新文章
- php+redis+两种驱动,redis的php驱动两种方式
- 成都铁路警方联合多部门开展反恐防暴演练
- Java实现链表结构的具体代码
- ASP、JSP、PHP 三种技术比较
- SpringBoot开源项目(企业信息化基础平台)
- 修改windows功能要开启哪个服务器,win7更改windows功能提示出现错误并非所有的功能被成功更改怎么办...
- iOS多线程开发之NSThread
- 如何在 Mac、iphone 中快速清除已完成的提醒?
- Visual Studio 远程调试设置
- 设计模式学习(四)工厂模式
- 如何学计算机打字,新手学电脑如何快速学会打字
- vue项目中微信分享安卓正常,ios报签名错误
- 前端成长之路之打好根基
- c++语言程序中,main()函数必须放在程序开始的部分,C++多选题(附答案)
- Android6.0动态获取权限java.io.FileNotFoundException: …Permission denied
- DHCP协议说明及报文分析
- Easymock十分钟入门
- A* 流程+代码详细注释
- 电影记忆之16(人工智能)
- hive 压缩格式汇总