手部姿态识别中如何将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
相关产品推荐
相关产品推荐

