基于Opencv的mediapipe手势识别代码

        这个博客主要是针对我自己发布的手势识别代码资源的修改方式,有需要的可以到我的主页去下载该资源。地址如下https://download.csdn.net/download/qq_35675872/89619225?spm=1001.2014.3001.5501

一、如何使用该代码

        该手势识别代码是基于opencv的mediapipe手势识别代码,首先你的电脑需要有相应的环境,即需要先安装opencv和mediapipe。

        在安装并配置好相关环境后,首先需要对dataset中的文件进行修改,具体修改方式见下文第二点,这里可以先使用我提前收集好的数据集。

        接下来需要先打开extract_feature.py文件并运行,运行需要一定的时间。程序运行完自动退出后会在文件根目录下生成一个名为finger_feature的文件夹,看到文件夹后即可进行下一步。

        打开train_gesture_classifier.py文件,直接运行。程序运行结束后会在根目录下输出一个名为gesture_detector.model的模型文件,终端中会输出本次训练出的模型的准确率,可以多训练几次得到正确率最高的模型。

        得到了模型之后打开gesture_detector.py,直接运行即可使用电脑摄像头进行对于手势的实时识别。

二、修改需要识别的手势

        想要识别需要识别的手势,需要到文件夹的根目录中的dateset目录下。

        像图片中这样将建立子文件夹并命名,比如我这里的000-rock就代表的是第0种手势是石头,其它文件夹也是同理。新建完文件夹后需要向其中添加数据集,比如000-rock种就要添加尽可能多且清晰的石头手势,并且每个图片中最好只出现一个人手。

        在添加完数据集后还需要对代码进行一定的修改。打开根目录下的gesture_detector.py文件,找到以下内容:

data = ["石头","一","剪刀","三","四","布","六","七","八","九","无"]

        这里代表了在dataset中的各类手势,将其中的内容改为dataset中对应的即可,并且将最后的"无"保留。

        在修改完data中的内容后,还需要对gesture_detector.py的第109行进行修改。

output = f"手势:{data[10]}"

        将这里的10改为data的长度减一。

        在全部都修改完毕之后按照文章一开始的流程训练一次即可。

三、修改指节算法

        修改指节算法的目的是通过对不同指节的距离进行加减以判断手势的种类,适当的修改可以提高识别的准确率,但是过度的修改反而会适得其反。手的各个指节的代码如下图所示:

        首先打开extract_feature.py文件并找到如下代码。

    for finger_idx in [4, 8, 12, 16]:
        tips_distance.append(np.linalg.norm(hand_landmarks_np[finger_idx] - hand_landmarks_np[finger_idx + 4]))
    tips_distance.append(np.linalg.norm(hand_landmarks_np[20] - hand_landmarks_np[4]))

        这段代码的含义就是计算了每个相邻指尖以及大拇指与小拇指指尖之间的距离之和。也就是说我们训练的模型是通过这些指尖的距离来判断手势的。

        如果你想要添加更多的细节只需要在这些代码后面添上相应的内容即可,比如我除了想计算指尖指尖的距离,我还想计算指尖到指根的距离,那根据以上的指节编号,就是指节4与指节1的距离加上指节8与指节5的距离再加上.......。那么我们就可以这么写:

    for finger_idx in [4, 8, 12, 16, 20]:
        tips_distance.append(np.linalg.norm(hand_landmarks_np[finger_idx] - hand_landmarks_np[finger_idx - 3]))

        以此类推也可以加上或减去一些指节间的计算。

        在对extract_feature.py中的内容进行修改过后,还需要对gesture_detector.py中的内容进行相应的修改。在函数 finger_distance_feature(hand_landmarks) 中找到extract_feature.py中我们找到的代码,然后将其中的内容改为与extract_feature.py文件中修改过后的代码一致即可。

        修改完后同样需要重新训练模型才能使用。使用摄像头进行识别时若出现如 ValueError: X has 4 features, but KNeighborsClassifier is expecting 5 features as input. 的报错,则说明gesture_detector.py与extract_feature.py中的代码修改不一致。

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用Python+OpenCV+MediaPipe实现手势识别系统的项目示例: 1. 安装必要的库,包括OpenCVMediaPipe和NumPy等。 ``` pip install opencv-python mediapipe numpy ``` 2. 导入必要的库和模块: ```python import cv2 import mediapipe as mp import numpy as np ``` 3. 初始化Hand Tracking模块: ```python mp_hands = mp.solutions.hands hands = mp_hands.Hands( static_image_mode=False, max_num_hands=2, min_detection_confidence=0.7, min_tracking_confidence=0.7) ``` 4. 读取摄像头捕获到的图像: ```python cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: continue ``` 5. 对图像中的手部进行跟踪和检测: ```python # 转换图像颜色空间 image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 处理图像 results = hands.process(image) # 将图像颜色空间转换回来 image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) ``` 6. 对检测到的手部进行手势识别,并根据识别结果做出相应的反应: ```python # 检测到手部 if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # 获取手部关键点坐标 landmarks = np.array([[lmk.x, lmk.y, lmk.z] for lmk in hand_landmarks.landmark]).T # 进行手势识别 gesture = gesture_recognition(landmarks) # 根据手势识别结果做出相应的反应 if gesture == 'Fist': # 做出拳头手势的反应 ... elif gesture == 'Open': # 做出张开手掌的反应 ... else: # 其他手势的反应 ... ``` 7. 释放摄像头和Hand Tracking模块,并关闭窗口: ```python cap.release() hands.close() cv2.destroyAllWindows() ``` 需要注意的是,以上代码只是一个简单的示例,实际的手势识别系统还需要进行模型的训练和优化,以及对不同的手势进行分类和识别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值