如何提取Mediapipe特定姿态点与手部点并构建固定长度数组
解决方案
核心思路是先初始化固定长度的空数组(用NaN填充缺失值),再根据关键点ID精准赋值,不管模型是否检测到目标关键点,数组结构始终保持3行24列(X/Y/Z各一行,对应3个姿态点+21个手部点)。
具体实现步骤
- 初始化固定形状的数组:创建一个3×24的numpy数组,用
np.nan填充,标记缺失的关键点坐标。 - 提取姿态关键点:检查姿态检测结果是否存在,若存在则根据ID(12、14、16)提取对应点的X/Y/Z值,放到数组的前3个位置。
- 提取手部关键点:检查右手检测结果是否存在,若存在则依次提取21个手部点的X/Y/Z值,放到数组的第4到24个位置。
- 输出最终数组:此时数组长度固定,缺失点保留NaN,可直接用于后续计算。
代码示例
import numpy as np import mediapipe as mp # 初始化Mediapipe模型 mp_pose = mp.solutions.pose mp_hands = mp.solutions.hands pose = mp_pose.Pose() hands = mp_hands.Hands() # 处理单帧图像的结果(假设results是模型输出) def process_landmarks(results): # 初始化3行24列的空数组,用NaN填充 final_array = np.full((3, 24), np.nan) # 处理姿态关键点(12、14、16号点) if results.pose_landmarks: # 定义需要提取的姿态点ID和对应的数组索引 pose_ids = [12, 14, 16] for idx, landmark_id in enumerate(pose_ids): landmark = results.pose_landmarks.landmark[landmark_id] final_array[0, idx] = landmark.x # X坐标 final_array[1, idx] = landmark.y # Y坐标 final_array[2, idx] = landmark.z # Z坐标 # 处理右手关键点(21个点) if results.right_hand_landmarks: for idx, landmark in enumerate(results.right_hand_landmarks.landmark): # 手部点从数组的第4个位置开始(索引3) final_array[0, 3 + idx] = landmark.x final_array[1, 3 + idx] = landmark.y final_array[2, 3 + idx] = landmark.z return final_array
关键说明
- 用
np.full初始化固定形状数组,避免因关键点缺失导致数组长度变化。 - 直接通过关键点ID提取坐标,不需要合并后删除多余点,从根源解决“关节前移”的问题。
- 缺失的关键点用
np.nan标记,后续计算时可通过np.isnan()判断并处理缺失值(比如插值、跳过等)。
内容的提问来源于stack exchange,提问作者SpaceFlier
相关产品推荐
相关产品推荐

