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

MediaPipe手势识别仅返回单手结果,如何实现双手独立识别?

解决MediaPipe双手独立手势识别的问题

1. 调整GestureRecognizer的初始化配置

别光给mp_hands.Hands设max_num_hands=2,GestureRecognizer本身也得配置成支持两只手。初始化的时候用GestureRecognizerOptions明确设置num_hands=2:

from mediapipe.tasks import python
from mediapipe.tasks.python import vision

base_options = python.BaseOptions(model_asset_path='gesture_recognizer.task')
options = vision.GestureRecognizerOptions(
    base_options=base_options,
    num_hands=2  # 这个参数必须和mp_hands的max_num_hands对应
)
recognizer = vision.GestureRecognizer.create_from_options(options)

只有这里设对了,识别器才会同时处理两只手的关键点,返回各自的手势结果。

2. 正确遍历结果列表

GestureRecognizerResult里的gestures、hand_landmarks、handedness都是按手的检测顺序排列的列表,每一项对应一只手。要拿到每只手的手势,得遍历这些列表:

# 假设mp_image是处理好的输入图像
result = recognizer.recognize(mp_image)

# 挨个处理每只手的结果
for idx in range(len(result.gestures)):
    # 取置信度最高的手势
    gesture_name = result.gestures[idx][0].category_name
    # 区分左右手
    hand_side = result.handedness[idx][0].category_name
    print(f"{hand_side}手的手势: {gesture_name}")

注意result.gestures里的每个元素是候选手势列表,取第一个元素[0]就是最可能的那个手势。

3. 检查输入图像的处理流程

如果图像预处理不对,也可能导致识别器只返回单只手的结果。确保把OpenCV的BGR帧转成RGB,再包装成MediaPipe的Image对象:

import cv2
import mediapipe as mp

cap = cv2.VideoCapture(0)
while cap.isOpened():
    success, frame = cap.read()
    if not success:
        break
    # OpenCV读的是BGR,转成RGB
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # 包装成MediaPipe要求的Image格式
    mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb_frame)
    # 执行识别
    result = recognizer.recognize(mp_image)
    # 按步骤2的方式处理结果
    # ... 后续绘制手势或业务逻辑

4. 确认模型文件没问题

别用自定义训练的仅支持单手的模型,直接用官方提供的gesture_recognizer.task模型,默认就是支持多手识别的,配置对了就能出双手结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:07:02