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

如何提取Mediapipe特定姿态点与手部点并构建固定长度数组

解决方案

核心思路是先初始化固定长度的空数组(用NaN填充缺失值),再根据关键点ID精准赋值,不管模型是否检测到目标关键点,数组结构始终保持3行24列(X/Y/Z各一行,对应3个姿态点+21个手部点)。

具体实现步骤

  1. 初始化固定形状的数组:创建一个3×24的numpy数组,用np.nan填充,标记缺失的关键点坐标。
  2. 提取姿态关键点:检查姿态检测结果是否存在,若存在则根据ID(12、14、16)提取对应点的X/Y/Z值,放到数组的前3个位置。
  3. 提取手部关键点:检查右手检测结果是否存在,若存在则依次提取21个手部点的X/Y/Z值,放到数组的第4到24个位置。
  4. 输出最终数组:此时数组长度固定,缺失点保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:21:05