手势鼠标一 —— 不发送数据

以下是使用 MediaPipe 的 GestureRecognizer 模块(2023年后新版特性)实现手势识别的代码,直接调用内置的预训练手势判断模型,无需自定义逻辑:


步骤 1:安装新版 MediaPipe

pip install mediapipe>=0.10.0

步骤 2:下载预训练模型文件

从 MediaPipe 的 官方模型仓库 下载以下文件:
手势识别模型文件: gesture_recognizer.task
手部关键点模型文件: hand_landmarker.task


步骤 3:完整代码实现

import cv2
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

# 初始化模型路径
GESTURE_MODEL_PATH = 'gesture_recognizer.task'  # 替换为你的模型路径
HAND_MODEL_PATH = 'hand_landmarker.task'        # 替换为手部关键点模型路径

# 创建手势识别器配置
base_options = python.BaseOptions(model_asset_path=GESTURE_MODEL_PATH)
options = vision.GestureRecognizerOptions(
    base_options=base_options,
    running_mode=vision.RunningMode.VIDEO,      # 视频流模式
    num_hands=2,                                # 检测手部数量
    min_hand_detection_confidence=0.5,          # 手部检测置信度阈值
    min_hand_presence_confidence=0.5,           # 手部存在置信度阈值
    min_tracking_confidence=0.5,                # 追踪置信度阈值
    csv_file=None                               # 自定义手势标签文件(可选)
)

# 初始化识别器
recognizer = vision.GestureRecognizer.create_from_options(options)

# 打开摄像头
cap = cv2.VideoCapture(0)
frame_timestamp_ms = 0  # 视频模式需要时间戳

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 转换为MediaPipe所需的Image格式
    mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)

    # 执行手势识别
    recognition_result = recognizer.recognize_for_video(mp_image, frame_timestamp_ms)
    frame_timestamp_ms += 1  # 时间戳递增(模拟视频流)

    # 绘制识别结果
    if recognition_result.gestures:
        for hand_gestures, hand_landmarks in zip(
            recognition_result.gestures, recognition_result.hand_landmarks
        ):
            # 获取手势名称和置信度
            top_gesture = hand_gestures[0]
            gesture_name = top_gesture.category_name
            confidence = top_gesture.score

            # 在画面中显示结果
            cv2.putText(
                frame,
                f"{gesture_name} ({confidence:.2f})",
                (10, 50),
                cv2.FONT_HERSHEY_SIMPLEX,
                1,
                (0, 255, 0),
                2
            )

            # 绘制手部关键点(可选)
            for landmark in hand_landmarks:
                x = int(landmark.x * frame.shape[1])
                y = int(landmark.y * frame.shape[0])
                cv2.circle(frame, (x, y), 3, (0, 0, 255), -1)

    cv2.imshow('MediaPipe Gesture Recognition', frame)
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

代码说明

关键部分功能
GestureRecognizerOptions配置手势识别参数(检测手部数量、置信度阈值等)
recognize_for_video()针对视频流模式的识别方法,需传入时间戳
recognition_result包含手势分类结果(gestures)和手部关键点(hand_landmarks)的数据结构
内置手势标签直接输出如 Open_Palm, Thumb_Up, Victory, Closed_Fist 等预设手势

支持的内置手势列表

MediaPipe 的 gesture_recognizer.task 默认支持以下手势(完整列表参考官方文档):

None
Closed_Fist
Open_Palm
Pointing_Up
Thumb_Down
Thumb_Up
Victory
ILoveYou

扩展自定义手势

若需添加自定义手势,可以通过以下步骤实现: 1. 准备训练数据:收集手势图片并标注类别。 2. 生成 .csv 标签文件(参考官方格式)。 3. 在 GestureRecognizerOptions 中指定 csv_file 参数: python options = vision.GestureRecognizerOptions( base_options=base_options, csv_file='custom_gestures.csv' # 自定义手势标签文件 )


优缺点对比

方案优点缺点
自定义手势判断完全控制逻辑,适合特殊手势开发成本高,需手动编写判断规则
GestureRecognizer开箱即用,直接输出预设手势仅支持有限预定义手势
混合方案结合预训练模型和自定义逻辑,灵活性强需额外集成代码

建议优先使用 GestureRecognizer 满足常见需求,复杂场景再考虑混合方案。

此条目发表在手势鼠标分类目录。将固定链接加入收藏夹。