基于 Mediapipe 手部识别的动作检测

使用 Google 的 Mediapipe 解决方案来检测手部的“OK”手势。以及根据拇指和食指的位置来确定当前检测到的手是左手还是右手。

环境准备

  • 安装 OpenCV: pip install opencv-python
  • 安装 Mediapipe: pip install mediapipe

代码

import cv2
import mediapipe as mp
import numpy as np

mp_hands = mp.solutions.hands # 加载手部关键点模型
mp_drawing = mp.solutions.drawing_utils # 加载绘图工具


def is_ok_gesture(landmarks): # 判断是否是 OK 手势
    thumb_tip = np.array(
        [landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP].x, landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP].y]) # 获取大拇指尖的坐标
    index_finger_tip = np.array([landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP].x,
                                 landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP].y])  # 获取食指尖的坐标

    # 计算大拇指和食指尖的距离
    distance = np.linalg.norm(thumb_tip - index_finger_tip)

    # 检查其它三个手指是否伸直
    middle_finger_tip = landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP].y
    ring_finger_tip = landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_TIP].y
    pinky_tip = landmarks.landmark[mp_hands.HandLandmark.PINKY_TIP].y

    if distance < 0.05 and middle_finger_tip < ring_finger_tip and ring_finger_tip < pinky_tip: 
        return True
    return False

def detect_hand_actions(image):
    with mp_hands.Hands(min_detection_confidence=0.2, min_tracking_confidence=0.5) as hands: # 设置置信度
        image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 
        results = hands.process(image_rgb) # 处理图像
        if results.multi_hand_landmarks: # 检查是否检测到手部
            for landmarks in results.multi_hand_landmarks: # 遍历每一只手
                mp_drawing.draw_landmarks(image, landmarks, mp_hands.HAND_CONNECTIONS) # 绘制关键点连线

                if is_ok_gesture(landmarks): # 判断是否是 OK 手势
                    cv2.putText(image, 'OK 手势', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2,
                                cv2.LINE_AA)

                # 以下代码是获取手指的关键点
                thumb_tip = landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP]
                index_finger_tip = landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]

                # 这里只是一个简单示例,您可以添加更多的逻辑来识别特定的手部动作
                if thumb_tip.x > index_finger_tip.x:
                    print("右手")
                else:
                    print("左手")



    return image


cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        continue

    image = detect_hand_actions(frame)
    cv2.imshow('Hand Action Detection', image)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MediaPipe手势识别技术的核心是手部关键点检测手部关键点检测是指通过摄像头等设备采集的图像,识别出手掌和手指等关键部位的位置和姿态信息。 MediaPipe使用深度神经网络来实现手部关键点检测。具体来说,MediaPipe首先使用一种称为BlazePalm的预训练神经网络,对手掌部位进行检测和定位。然后,使用另一种称为HandLandmark的神经网络对手指部位进行检测和定位。最后,将手掌和手指的位置和姿态信息进行融合,得到手部关键点的位置和姿态信息。 具体实现过程如下: 1. 预处理:首先需要对采集到的图像进行预处理,包括图像缩放、裁剪、归一化等操作,以符合神经网络的输入要求。 2. Hand Detection(手掌检测):使用BlazePalm模型对图像中的手掌部位进行检测和定位。BlazePalm模型是一种基于单阈值的神经网络,可以通过分析图像中的像素值和边缘信息,判断出手掌的位置和姿态信息。 3. Hand Landmark(手部关键点检测):使用HandLandmark模型对手指部位进行检测和定位。HandLandmark模型是一种基于卷积神经网络的模型,可以对手指的位置和姿态信息进行高精度的识别。 4. Pose Fusion(姿态信息融合):将手掌和手指的位置和姿态信息进行融合,得到手部关键点的位置和姿态信息。 5. 鼠标指令生成:根据识别出的手势信息,生成对应的鼠标指令。MediaPipe提供了一些示例代码,可以将手势信息转化为鼠标移动、点击、滚动等指令。 6. 鼠标指令执行:将生成的鼠标指令发送给操作系统,执行相应的鼠标操作。 需要注意的是,MediaPipe手部关键点检测技术虽然非常准确,但也存在一些限制和缺陷,如对光线、手势大小、手势速度等因素的敏感度较高,以及对于一些复杂手势的识别准确度还需要进一步提高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qwqqq2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值