You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手部姿态识别中如何将multi_hand_landmarks转换为numpy array?

解决multi_hand_landmarks数据提取与中点计算问题

你提到的multi_hand_landmarks通常是MediaPipe手部姿态识别返回的结果集合,其中每个手部对应一个hand_landmarks对象,包含21个Landmark类型的关节点,每个关节点自带x、y、z三个属性存储3D坐标。以下是直接提取坐标并计算中点的实现方法:

1. 提取单只手的关节坐标集合

先从multi_hand_landmarks中取出目标手部的关节数据,再遍历提取每个关节的三维坐标:

# 假设results是MediaPipe识别后的返回结果
if results.multi_hand_landmarks:
    # 获取第一只手的关节数据(若有多只手,可遍历multi_hand_landmarks处理)
    target_hand = results.multi_hand_landmarks[0]
    # 存储所有关节的3D坐标
    joint_coords = []
    for landmark in target_hand.landmark:
        # 提取x/y/z并转为浮点型,存入列表
        coords = (float(landmark.x), float(landmark.y), float(landmark.z))
        joint_coords.append(coords)

2. 计算两个关节的中点坐标

对两个关节的三个维度分别取平均值即可得到中点:

def get_midpoint(coord_a, coord_b):
    mid_x = (coord_a[0] + coord_b[0]) / 2
    mid_y = (coord_a[1] + coord_b[1]) / 2
    mid_z = (coord_a[2] + coord_b[2]) / 2
    return (mid_x, mid_y, mid_z)

# 示例:计算拇指尖(索引4)与食指尖(索引8)的中点
thumb_tip = joint_coords[4]
index_tip = joint_coords[8]
mid_point = get_midpoint(thumb_tip, index_tip)
print("中点坐标:", mid_point)

补充说明

  • 若需要将归一化的x/y转为图像像素坐标,只需乘以图像的宽和高:
    img_w, img_h = image.shape[1], image.shape[0]
    pixel_x = int(landmark.x * img_w)
    pixel_y = int(landmark.y * img_h)
    
  • 多手场景下,直接遍历results.multi_hand_landmarks即可分别处理每只手的关节数据。

内容的提问来源于stack exchange,提问作者Cobsice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:55:19