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

Mediapipe Hands双手关键点输出顺序是否固定交替?

核心结论

当画面中同时存在两只手时,Mediapipe Hands的multi_hand_landmarks输出不会始终在两只手之间交替返回,返回顺序无稳定保证。
不同帧之间同一只手对应的列表索引可能随机跳变,在手部快速移动、双手交叉、单只手短暂出画再入画的场景下顺序错乱概率极高,绝对不能依赖遍历顺序区分左右手,否则会出现关键点和手的匹配错误,直接导致LSTM训练数据标签混乱。

正确匹配左右手的实现方式

你代码中已经打印过的results.multi_handedness字段,就是官方提供的左右手分类结果,它和multi_hand_landmarks列表长度完全一致,相同索引位置的元素是一一对应关系:

  • 索引i对应的multi_hand_landmarks[i]是第i个检测到的手部21个关键点集合
  • 索引i对应的multi_handedness[i]是该手部的分类结果,其中classification[0].label字段取值为'Left'或'Right'标记左右手,classification[0].score为分类置信度

注意:如果使用前置摄像头拍摄第一人称视角素材,默认输出的左右标签是镜像反转的,需要自行做一次左右映射修正。

适配Mediapipe Hands的关键点提取代码如下,和你之前Holistic方案的输出格式完全兼容,可以直接喂给LSTM网络:

def extract_keypoints(results):
    # 初始化左右手关键点数组,未检测到手时用全零填充
    lh = np.zeros(21 * 3)
    rh = np.zeros(21 * 3)
    
    if results.multi_hand_landmarks:
        # 按索引同步遍历关键点和左右手分类结果,保证匹配正确
        for idx, hand_landmarks in enumerate(results.multi_hand_landmarks):
            hand_info = results.multi_handedness[idx].classification[0]
            # 提取当前手的关键点并展平为一维数组
            curr_kp = np.array([[res.x, res.y, res.z] for res in hand_landmarks.landmark]).flatten()
            
            # 前置第一人称拍摄时取消下一行注释,修正镜像左右反转问题
            # hand_label = "Right" if hand_info.label == "Left" else "Left"
            hand_label = hand_info.label
            
            if hand_label == "Left":
                lh = curr_kp
            else:
                rh = curr_kp
    
    return np.concatenate([lh, rh])
注意事项
  • 不要通过关键点的x坐标相对位置判断左右手,双手交叉时坐标判断逻辑会完全失效,稳定性远低于官方自带的multi_handedness分类结果
  • 单帧出现单只手漏检时保留全零填充逻辑即可,和原Holistic方案的输入格式保持一致,不需要额外调整LSTM网络的输入维度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:18:16