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

       与基于屏幕空间的 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.mzph.cn/news/666808.shtml

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

相关文章

常见的web前端开发框架介绍

Web前端开发框架是为了简化网页设计和开发的流程而创建的工具集。它们提供了预定义的组件、工具和库,帮助开发者快速构建交互式的用户界面。以下是一些常见的Web前端开发框架,以及它们的原理、基础技术和应用场景的介绍: 1. React **…

APK签名 v1、 v2、v3、v3.1、v4 解析

在 Android 应用签名中,V1 V2 V3 V4签名是不同的签名方案,具体描述如下: V1 签名(JAR 签名):早期 Android 应用签名的基本形式,基于 Java 签名(JAR 签名)规范。它将应用…

<Linux> 进程信号

目录 一、信号概念 二、信号的作用 三、信号的特性 四、信号捕捉初识 五、信号产生 (一)通过终端按键产生信号 (二)硬件中断 (三)系统调用产生信号 1. kill 函数 2. raise 函数 3. abort 函数 …

Redis核心技术与实战【学习笔记】 - 22.浅谈Redis的ACID相关知识

概述 事务是数据库的一个重要功能。所谓的事务,就是指对数据进行读写的一系列操作。事务在执行时,会提供专门的属性保证,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isol…

2024.02.04

写出三种进程间通信的代码示例 有名管道 创建两个有名管道文件 #include <myhead.h> int main(int argc, const char *argv[]) {if(mkfifo("pipe1",0664)-1){perror("mkfifo pipe1 error");return -1;}if(mkfifo("pipe2",0664)-1){perr…

sentinel的Context创建流程分析

sentinel入门 功能 限流&#xff1a;通过限制请求速率、并发数或者用户数量来控制系统的流量&#xff0c;防止系统因为流量过大而崩溃或无响应的情况发生。 熔断&#xff1a;在系统出现故障或异常时将故障节点从系统中断开&#xff0c;从而保证系统的可用性。 降级&#xf…

性能测试工具架构

背景 性能测试工具&#xff08;LoadRunner为例&#xff09; 性能测试工具通常是指那些用来支持压力、负载测试&#xff0c;能够录制和生成脚本、设置和部署场景、产生并发用户和向系统施加持续压力的工具。 性能测试工具录制的是服务端与应用之间的通信数据&#xff0c;而不是…

【Spring】自定义注解 + AOP 记录用户的使用日志

目录 ​编辑 自定义注解 AOP 记录用户的使用日志 使用背景 落地实践 一&#xff1a;自定义注解 二&#xff1a;切面配置 三&#xff1a;Api层使用 使用效果 自定义注解 AOP 记录用户的使用日志 使用背景 &#xff08;1&#xff09;在学校项目中&#xff0c;安防平台…

【RT-DETR有效改进】 DySample一种超级轻量的动态上采样算子(上采样中的No.1)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、 本文介绍 本文给大家带来的改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具…

整理:汉诺塔简析

大体上&#xff0c;要解决一个汉诺塔问题&#xff0c;就需要解决两个更简单的汉诺塔问题 以盘子数量 3 的汉诺塔问题为例 要将 3 个盘子从 A 移动到 C&#xff0c;就要&#xff1a; 将两个盘子从 A 移动到 B&#xff08;子问题 1&#xff09; 为了解决子问题 1&#xff0c;就…

clickhouse在MES中的应用-跟踪扫描

开发的MES&#xff0c;往往都要做生产执行跟踪扫描&#xff0c;这样会产生大量的扫描数据&#xff0c;用关系型数据库&#xff0c;很容易造成查询冲突的问题。 生产跟踪扫描就发生的密度是非常高的&#xff0c;每个零部件的加工过程&#xff0c;都要被记录下来&#xff0c;特别…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(三)

接上文&#xff0c;本章尝试在RV1106上使用TBB。依然是一言难尽&#xff0c;此文依然只是记录实践过程。 源码下载&#xff0c;编译TBB 下载地址: https://github.com/oneapi-src/oneTBB 版本使用 oneTBB-2021.11.0&#xff0c;这个版本可以使用cmake编译。 cmake配置完后&am…

动手学深度学习v2-线性回归-笔记

简化核心模型 假设1: 影响房价的关键因素是卧室个数&#xff0c;卫生间个数和居住面积&#xff0c;记为 x 1 x_{1} x1​&#xff0c; x 2 x_{2} x2​&#xff0c; x 3 x_{3} x3​假设2: 成交价是关键因素的加权和 y w 1 x 1 w 2 x 2 w 3 x 3 b yw_{1}x_{1}w_{2}x_{2}w_{3…

鲲鹏--垂直生态领导者

这是ren_dong的第24篇原创 1、概述 华为鲲鹏920&#xff1a;性能最高的ARM架构服务器芯片 鲲鹏是华为在芯片领域布局的重要一环 &#xff0c;是垂直生态的领导者&#xff0c;鲲鹏芯片诞生于2020年 &#xff0c;已获得ARMv8架构的永久授权&#xff0c;主要聚焦通用计算领域华为针…

typecho 在文章中添加 bilibili 视频

一、获取视频来源&#xff1a; 可以有2种方式来定位一个 bilibili 视频&#xff1a; 第一种是使用 bvid 参数定位第二种是使用 aid 参数定位 如何获取这两个参数&#xff1f; 首先我们可以看看 bilibili 网站中的视频页面链接其实可以分为两种&#xff1a; 第一种是类似&a…

建材智能工厂数字孪生可视化管控平台,推进建材行业数字化转型

建材智能工厂数字孪生可视化管控平台&#xff0c;推进建材行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的重要趋势。在建材行业中&#xff0c;智能工厂和数字孪生技术的应用正在改变传统的生产模式和管理方式&#xff0c;为行业的数字化转型…

C语言常见面试题:C语言中如何进行加密解密编程?

在C语言中进行加密和解密编程通常涉及到使用加密算法和相关的库。下面是一些常用的加密和解密算法以及如何使用它们的基本说明&#xff1a; AES加密算法&#xff1a; AES&#xff08;Advanced Encryption Standard&#xff09;是一种常用的对称加密算法。在C语言中&#xff0c;…

clr的执行模型-笔记

学习来源&#xff1a;《CLR via C by Jeffrey Richter 》第四版&#xff0c;第1章 clr的执行模型 1.C#编译生成执行程序集文件 编译文件的组成&#xff1a;pe32/pe32头&#xff0c;clr头&#xff0c;元数据&#xff0c;IL pe32/pe32头&#xff1a;windows标准执行文件头 cl…

mac 12.7.3 Unity 2021.3.14 XCode 14.2 成功将unity游戏编译到IPhone中,并上架appstore

上一篇文章 mac 10.15.7 & Unity 2021.3.14 & XCode 12.4 -&#xff1e; Unity IOS 自动安装 Cocoapods 失败解决方法 从上一篇文章完成后&#xff0c;unity 已经可以导出 xcode 工程&#xff0c;但是&#xff0c;app是没法上架到appstore上的&#xff0c;原因如下&am…

C++函数对象-运算符函数对象 - 比较 - 实现 x == y 的函数对象(std::equal_to)

任何定义了函数调用操作符的对象都是函数对象。C 支持创建、操作新的函数对象&#xff0c;同时也提供了许多内置的函数对象。 运算符函数对象 C 针对常用的算术和逻辑运算定义了很多函数对象&#xff1a; 比较 实现 x y 的函数对象 std::equal_to template< class T >…