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
相关产品推荐
相关产品推荐

