【iOS ARKit】3D 人体姿态估计

news2024/11/25 21:21:35

       与基于屏幕空间的 2D人体姿态估计不同,3D人体姿态估计是尝试还原人体在三维世界中的形状与姿态,包括深度信息。绝大多数的现有3D人体姿态估计方法依赖2D人体姿态估计,通过获取 2D人体姿态后再构建神经网络算法,实现从 2D 到 3D人体姿态的映射。

      在 ARKit中,由于是采用计算机视觉的方式估计人体姿态,与2D人体姿态估计一样,3D人体姿态估计也受到遮挡、光照、姿态、视角的影响,并且相比于2D人体姿态估计,3D人体姿态估计计算量要大得多,也要复杂得多。但幸运的是,我们并不需要去关注底层的算法实现,ARKit会在检测到人体时直接提供一个ARBodyAnchor 类型对象,该对象包含一个 ARSkeleton3D类型的人体骨骼类型,通过这个类型可以获取所有检测到的人体骨骼关节点信息。ARBodyAnchor 描述了检测到的3D人形结构信息,其结构如下图所示。

     对比图2D结构,可以看到,在 ARKit 中,2D与3D人体关节结构层次基本一致,唯一不同的是,在3D 人体结构中,多了一个表示 3D 人体空间位置信息的 Transform(ARBodyAnchor 下的Transform)。在使用上,这两者使用方法完全一样,只是代表3D 人体骨骼的Skeleton 结构比2D更复杂。

      描述 3D人体骨骼结构的类为 ARSkeleton3D,也继承自 ARSkeleton 类,ARSkeleton3D 描述了3D空间中的人体骨骼节点结构。由于描述的人体结构是在三维空间中的层次结构,该类包含两个表示位置信息的数组 jointLocalTransforms 和 jointModelTransforms,其中jointLocalTransforms 描述的位置信息是某个节点相对其父节点的位置,而jointModelTransforms 描述的位置信息是相对检测到的ARBodyAnchor 位置。jointLocalTransforms 和 jointModelTransforms 包含的是3D空间中各关节点的位置信息矩阵。

     在使用中,可以通过 ARSkeleton3D 的 localTransform(for: ARSkeleton. JointName)方法得到某个关节点相对其父节点的位置,此方法需要传递关节点的原始名称(rawValue)而不是ARSkeleton 预定义的关节点名(预定义关节点名可以通过其.rawValue 获取原始名称)。同样,我们也可以通过 modelTransform(for: ARSkeleton. JointName)方法得到某个关节点相对 ARBodyAnchor 的位置。

       jointLocalTransforms 和 jointModelTransforms都是simd_float4x4 类型数组,因此我们也可以直接通过下标取到特定的关节点位置信息,下标方法取值比使用localTransform() 和 modelTransform()方法快得多,特别是对每次 ARAnchor update 都要执行的循环操作,可以节省很多时间。获取特定节点名称的索引值可以通过 definition.index (for:)方法实现。除此之外,还可以通过 ARSkeleton3D 的 isJointTracked(_:)方法查询每一个关节点在当前帧的检测跟踪情况,也可以获取每一个关节点的父节点。

    得到姿态信息是一个仿射变换矩阵 在仿射变换矩阵中,每一列都代表了不同的变换元素。具体到 simd_float4x4 中,这四列分别对应于平移(Translation)、缩放(Scale)、旋转(Rotation)和透视(Perspective)的变换。

  1. 第一列 (columns.0): X 轴方向的基向量,它包含了 X 轴上的缩放比例。
  2. 第二列 (columns.1): Y 轴方向的基向量,它包含了 Y 轴上的缩放比例。
  3. 第三列 (columns.2): Z 轴方向的基向量,它包含了 Z 轴上的缩放比例。
  4. 第四列 (columns.3): 位移(Translation)向量,它包含了平移信息。

    对于旋转矩阵来说,它是正交矩阵,因此其中的这三列(columns.0、columns.1、columns.2)是互相垂直的单位向量,表示了旋转的方向。而平移向量则描述了物体在空间中的位置。在 ARKit 中的 jointModelTransforms 中,这些矩阵描述了每个关节相对于整个人体坐标系的变换,因此你可以使用其中的这些信息来实现例如骨骼动画、渲染等效果。

3D人体姿态估计基础

     3D人体姿态估计在娱乐电玩、体育科学、人机交互、教育培训、工业制造等领域都有着广泛的应用。在ARKit 中,我们可以很简单方便地从底层 API 中获取检测到的3D人体姿态估计数据信息,但应用这些数据却需要详细了解3D人体姿态估计数据结构。本节先从原理技术上阐述应用数据的机制,然后学习 ARKit中对3D人体骨骼节点的结构描述。

     在2D人体姿态估计中,ARKit 使用了17个人体骨骼关节点对姿态信息进行描述,在3D人体姿态估计中,这个数量要大得多,共使用了91个人体骨骼关节点进行描述,并且这91个关节点并不在一个平面内,而是以三维的形式分布在3D空间中,与2D人体骨骼关节点一样,这些骨骼关节点对应真实人体骨骼位置,它们的分布与相互连接关系如图所示。

     在图中,我们也可以看到,定义人体根骨骼的Root 节点不在脚底位置,而是在尾椎骨位置,所有其他骨骼都以 Root 节点为根。详细的骨骼节点关联关系如下表所示。

肢体部位

骨骼关节点名称

索引

父节点名称

索引

尾椎骨

root

0

一1

臀部

hips_joint

1

root

0

左腿

left_upLeg_joint

2

hips_joint

1

left_leg joint

3

left_upLeg_joint

2

left_foot_joint

4

left_leg_joint

3

left_toes_joint

5

left_foot_joint

4

left_toesEnd_joint

6

left_toes_joint

5

右腿

right_upLeg_joint

7

hips_joint

7

right_leg_joint

8

right_upLeg_joint

7

right_foot_joint

9

right_leg joint

8

right_toes _joint

10

right_foot_joint

9

right_toesEnd_joint

11

right_toes _joint

10

脊柱

spine_1 _joint

12

hips_joint

1

spine_2_joint

13

spine_ 1 joint

12

spine_3_joint

14

spine_2_joint

13

spine_4_joint

15

spine_3 _joint

14

spine_5 _joint

16

spine_4_joint

15

spine_6 _joint

17

spine_5_joint

16

spine_7_joint

18

spine_6_joint

17

左臂

left_shoulder_1_joint

19

spine_? joint

18

left_arm_joint

20

left_ shoulder_1_joint

19

left_forearm_ joint

21

left_arm_joint

20

左手

left_hand_joint

22

left_forearm_joint

21

左手食指

left_handIndexStart_joint

23

left_hand_joint

22

left_handIndex_ 1_joint

24

left_handIndexStart_joint

23

left_handIndex_2 _joint

25

left_handIndex_1 joint

24

left_handIndex_3_joint

26

left_handIndex_2_joint

25

left_handIndexEnd joint

27

left_handIndex_3 joint

26

左手中指

left_handMidStart_joint

28

left_hand_joint

22

left_handMid_1_ joint

29

left_handMidStart_joint

28

left_handMid_ 2_joint

30

left_handMid_1 _joint

29

left _handMid_3_joint

31

left_handMid_2 _joint

30

left_handMidEnd joint

32

left_handMid_3_joint

31

左手无名指

left_handPinkyStart_joint

33

left_hand_joint

22

left_handPinky_1_ joint

34

left_handPinkyStart_joint

33

left_handPinky_2 joint

35

left_handPinky_1 joint

34

left_handPinky_3 _joint

36

left_handPinky_ 2 joint

35

left_handPinkyEnd_joint

37

left_handPinky_3_joint

36

肢体部位

骨骼关节点名称

索引

父节点名称

索引

左手小指

left_handRingStart_joint

38

left_hand_joint

22

left_handRing_1_joint

39

left_ handRingStart_joint

38

left_handRing_2 joint

40

left_handRing_ 1_joint

39

left handRing_3_joint

41

left_handRing_2_ joint

40

left_handRingEnd_joint

42

left_ handRing_3_joint

41

左手母指

left_handThumbStart_ joint

43

lleft_hand_joint

22

left handThumb_1_joint

44

left_handThumbStart_ joint

43

left_handThumb_2 _joint

45

 left_handThumb_1_joint

44

left handThumbEnd_joint

46

left_handThumb_2_joint

45

颈椎

neck_1 _joint

47

spine_7_ joint

18

neck 2 joint

48

neck_1 _joint

47

neck_3_joint

49

neck_2 joint

48

neck_4 joint

50

neck_3 _joint

49

头部

head_joint

51

neck_4 _joint

50

下巴

jaw_joint

52

head_ joint

51

chin_ joint

53

jaw_ joint

52

左眼

left_eye _joint

54

head_joint

51

left_eyeLowerLid_joint

55

left_eye_joint

54

left_eyeUpperLid_joint

56

left_eye_joint

54

left_ eyeball_joint

57

left_eye_joint

54

鼻子

nose_joint

58

head joint

51

右眼

right_eye joint

59

head_joint

51

right_ eyeLowerLid_joint

60

right_eye_joint

59

right_eyeUpperLid joint

61

right_eye_joint

59

right_eyeball_joint

62

right_eye_ joint

59

右臂

right_shoulder_1 _joint

63

spine_7_joint

18

right_arm_joint

64

right_shoulder_1_joint

63

right_forearm_joint

65

right_arm_ joint

64

右手

right_hand_joint

66

right_forearm_joint

65

右手食指

right_handIndexStart_ joint

67

right_hand_joint

66

right_handindex_ 1_joint

68

right_handIndexStart_joint

67

right_ handIndex_2 joint

69

right_handIndex_ 1_joint

68

right_handIndex_3_joint

70

right_handIndex_2_ joint

69

right_handIndexEnd_joint

71

right_handIndex_3_joint

70

右手中指

right_ handMidStart_joint

72

right_hand_joint

66

right_handMid_1_ joint

73

right_handMidStart_joint

72

right_handMid_2_joint

74

right_handMid_1_joint

73

right_handMid_3 _joint

75

right_ handMid_ 2 joint

74

right_ handMidEnd_joint

76

right_handMid_3 _joint

75

肢体部位

骨骼关节点名称

索引

父节点名称

索引

右手无名指

right_handPinkyStart_ joint

77

right_hand_joint

66

right_ handPinky_1_joint

78

right_handPinkyStart _joint

77

right_handPinky_2_ joint

79

right_handPinky_1_joint

78

right_handPinky_3_ joint

80

right_handPinky_2 _joint

79

right_ handPinkyEnd_joint

81

right_handPinky_3_joint

80

右手小指

right_handRingStart_joint

82

right_hand_joint

66

right_handRing_ 1_joint

83

right_handRingStart_joint

82

right_ handRing_2_joint

84

right_handRing_ 1_joint

83

right_handRing_3 joint

85

right_handRing_2 joint

84

right_handRingEnd _joint

86

right_handRing_3_joint

85

右手母指

right_handThumbStart_ joint

87

right_hand_joint

66

right_handThumb_1_joint

88

right_handThumbStart_joint

87

right_handThumb_2_joint

89

right_handThumb_1_joint

88

right_handThumbEnd_joint

90

right_handThumb_2 _joint

89

     人体骨骼关节点名称开发者可以自行定义,但关节点数量、序号、关联关系必须与表中一致。如果用于驱动三维模型,人体骨骼关节点命名建议应与模型骨骼命名完全一致以减少错误和降低程序绑定压力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上线GPT应用的流程

上线一个应用是一个逐步迭代的过程,不断根据用户反馈和市场需求进行改进和优化。上线一个基于GPT的应用通常需要以下步骤,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.明确目标和用途…

神经网络 | 基于 CNN 模型实现土壤湿度预测

Hi,大家好,我是半亩花海。在现代农业和环境监测中,了解土壤湿度的变化对于作物生长和水资源管理至关重要。通过深度学习技术,特别是卷积神经网络,我们可以利用过去的土壤湿度数据来预测未来的湿度趋势。本文将使用 Pad…

音频二维码怎么制作出来的?支持多种格式音频生码的方法

怎么把一个音频的文件做成二维码图片呢?在日常工作和生活中,有很多的场景会需要使用音频类型的文件来展示内容,比如常见的英语听力、课程、听书等类型的内容,现在都可以用二维码展示。而且现在生成音频二维码的方法也很简单&#…

JavaWeb后端——控制反转IOC/依赖注入DI

控制反转:why,目标是要做到控制反转 依赖注入:how,如何实现控制反转,控制反转有很多方法,依赖注入是其中一种方法 控制反转(Inversion of Control, IoC)和依赖注入(Depe…

es6中标签模板

之所以写这篇文章,是因为标签模板是一个很容易让人忽略的知识点 首先我们已经非常熟悉模板字符串的使用方法 const name "诸葛亮" const templateString hello, My name is ${name}标签模板介绍 这里的标签模板其实不是模板,而是函数调用…

前端excel带样式导出 exceljs 插件的使用

本来用的xlsx和xlsx-style两个插件&#xff0c;过程一步一个坑&#xff0c;到完全能用要消灭好多bug。这时发现了exceljs&#xff0c;真香&#x1f600; 案例 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"view…

JAVA原型模式详解

原型模式 1 原型模式介绍 定义: 原型模式(Prototype Design Pattern)用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 西游记中的孙悟空 拔毛变小猴,孙悟空这种根据自己的形状复制出多个身外化身的技巧,在面向对象软件设计领…

ReactNative实现宽度变化实现的动画效果

效果如上图所示&#xff0c;通过修改设备宽度实现动画效果 import React, {useRef, useEffect, useState} from react; import {Animated, Text, View, Image} from react-native;const FadeInView props > {const fadeAnim useRef(new Animated.Value(0)).current;React…

大型装备制造企业案例分享——通过CRM系统管理全球业务

本期&#xff0c;小Z为大家带来的CRM管理系统客户案例是某大型装备制造企业运用Zoho CRM管理全球业务的过程分享。该企业是创业板上市公司&#xff0c;业务遍及100多个国家和地区&#xff0c;合作伙伴超百位&#xff0c;拥有覆盖全球的销售和服务网络。截止目前&#xff0c;相继…

教授LLM思考和行动:ReAct提示词工程

ReAct&#xff1a;论文主页 原文链接&#xff1a;Teaching LLMs to Think and Act: ReAct Prompt Engineering 在人类从事一项需要多个步骤的任务时&#xff0c;而步骤和步骤之间&#xff0c;或者说动作和动作之间&#xff0c;往往会有一个推理过程。让LLM把内心独白说出来&am…

一,凸包-----8,Graham Scan:实例

这个是个一般情况 1&#xff0c;初始化 如上图所示&#xff0c;按照先下后左的方式&#xff0c;先确定第一个极点1&#xff0c;然后以1为顶点按照角度排序&#xff0c;将1和最小的角度2放入S栈&#xff0c;将3-8按照角度从大到小压入T栈。 2&#xff0c; 从S栈的栈顶元素2和…

【Linux】 信号的保存 | 捕捉

对于信号&#xff0c;主要涉及到信号的产生、保存和捕获&#xff0c;之前谈到了信号的产生&#xff0c;这里主要介绍信号产生后如何进行保存和捕捉处理的原理。 一、信号的保存 1.阻塞信号 相关概念 实际执行处理信号的动作称为信号递达Delivery信号从产生到递达的过程称为信号…

机器学习笔记-EM+HMM

机器学习笔记-EMHMM EM算法-期望最大化算法HMM算法-马尔可夫状态 EM算法-期望最大化算法 计算期望和求极大值&#xff1a;数据缺失下的参数估计 HMM算法-马尔可夫状态 从一个状态到另外一个状态的随机过程。

PDF控件Spire.PDF for .NET【安全】演示:检测 PDF 文档是否受密码保护

Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库&#xff0c;开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理&#xff0c;且无需安装 Adobe Acrobat。 E-iceblue 功能类库Spire 系列文档处…

支持多字体、静动态的.NET图片验证码的开源项目

上次分享过 SkiaSharp 这个开源图形项目&#xff0c;并举了一个生成验证码的例子&#xff0c;具体见文章&#xff1a;《SkiaSharp&#xff1a;.NET强大而灵活的跨平台图形库》。 但文中验证码比较简单&#xff0c;刚好看到一个非常不错的图片验证码&#xff0c;分享给大家。 …

Java 使用 ant.jar 执行 SQL 脚本文件

Java 使用 ant.jar 执行 SQL 脚本文件&#xff0c;很简单。 在 pom.xml 中导入 ant 依赖 <dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.11</version> </dependency>sql 脚本文件…

STM32TIM定时器(1)

文章目录 前言一、介绍部分TIM简介了解定时器类型基本定时器框图通用定时器框图高级定时器框图定时器级联关系 所需简化定时器中断流程图时序部分预分频器时序计数器时序无影子寄存器计数器时序有影子寄存器计数器时序 时钟树 二、实例部分使用定时器计数使用对射红外传感器来控…

清华系面壁MiniCPM:国产AI模型新突破,2B小钢炮成本效率双优

前言 在人工智能的快速发展中&#xff0c;模型的规模和性能成为衡量先进技术的关键指标。最近&#xff0c;清华系创业团队面壁智能发布的面壁MiniCPM模型&#xff0c;以其2B&#xff08;24亿&#xff09;参数的“小钢炮”身份&#xff0c;成功挑战了70亿参数的国际大模型Mistr…

开关电源学习之Buck电路

一、引言 观察上方的电路&#xff0c;当开关闭合到A点时&#xff0c;电流流过电感线圈&#xff0c;形成阻碍电流流过的磁场&#xff0c;即产生相反的电动势&#xff1b;电感L被充磁&#xff0c;流经电感的电流线性增加&#xff0c;在电感未饱和前&#xff0c;电流线性增加&…

k8s-常用工作负载控制器(更高级管理Pod)

一、工作负载控制器是什么&#xff1f; 二、Deploymennt控制器&#xff1a;介绍与部署应用 部署 三、Deployment控制器&#xff1a;滚动升级、零停机 方式一&#xff1a; 通个加入健康检查可以&#xff0c;看到&#xff0c;nginx容器逐个被替代&#xff0c;最终每个都升级完成&…