基于python 和 mediapipe(主要)来实现的手语识别功能(复杂版)

 在开始前,请允许我介绍一下Mediapipe

MediaPipe是Google开发的一款开源框架,用于构建多模态应用机器学习解决方案,特别适用于处理实时和直播媒体。它提供了一系列预先训练好的模型,如面部检测、手势识别和人体姿态估计等,可以轻松集成到各种应用中。MediaPipe具有跨平台特性,支持包括Android、iOS、Desktop和Web在内的多种平台,能够实现高性能、低延迟的实时处理。

 可以使用以下代码来安装mediapipe库

pip install mediapipe

 

 

上面两幅图片分别是手部的21个关键点和国际手语姿势表格

我们本次的代码主要就基于国际手语姿势表格来进行判断和编写

以下是函数的解析和示例

  1. 角度计算 (get_angle 函数):
    • 使用向量点积和向量模长计算两个向量 v1 和 v2 之间的角度。
  2. 读取摄像头 (cap = cv2.VideoCapture(0)):
    • 初始化一个OpenCV的VideoCapture对象,参数0表示默认摄像头。
  3. 向量与X轴角度 (vecter_x_angle 函数):
    • 计算一个二维向量与X轴的角度,使用arctan函数并转换为度数。
  4. 手势字符串获取 (get_str_guester 函数):
    • 根据手指抬起的数量和手指的位置信息,识别不同的手势。

    • up_fingers 参数是一个列表,包含抬起的手指的ID。

    • list_fingers 参数是一个列表,包含所有手指的关键点坐标。

    • 根据不同的条件,函数会返回不同的字符串来代表手势:

      • 手指全部放下时,通过比较拇指与食指的距离来判断“E”或“S”。
      • 当只有食指抬起时,根据食指关节间的向量角度判断“X”,或根据食指方向判断“Z”、“P”或“D”。
      • 当只有一个手指抬起时,进一步判断这个手指是哪一根,然后根据特定条件识别不同的手势。
      • 当有两个手指抬起时,根据这两个手指的ID和它们的位置关系,识别更多的手势。
      • 当有三个或四个手指抬起时,根据手指ID组合识别手势。
      • 当五个手指都抬起时,计算拇指与食指距离,识别“O”或“C”。
      • 如果无法识别手势,则返回“recognizing”

 话不多说,上代码

def get_angle(v1,v2):
    angle = np.dot(v1,v2)/(np.sqrt(np.sum(v1*v1))*np.sqrt(np.sum(v2*v2)))
    angle = np.arccos(angle)/3.14*180
    return angle 
cap = cv2.VideoCapture(0)
str_guester = ''

def vecter_x_angle(v):
    return np.degrees(np.arctan2(v[1], v[0]))

def get_str_guester(up_fingers,list_fingers):
    global str_guester
    if len(up_fingers)==0:
        if distance(list_fingers[4], list_fingers[15]) < distance(list_fingers[4], list_fingers[14]):
         
  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OpenCV和mediapipe库可以实现动作识别,具体步骤如下: 1. 安装OpenCV和mediapipe库,可以使用pip命令进行安装。 2. 使用OpenCV读取视频或者摄像头的实时画面。 3. 使用mediapipe库中的姿势估计模型,对人体姿势进行估计。 4. 根据姿势估计结果,提取关键点信息,例如手臂、腿部等关键点的位置和角度。 5. 根据关键点信息,设计算法进行动作识别,例如可以使用机器学习算法进行分类识别。 6. 根据识别结果,进行相应的处理,例如输出识别结果或者触发相应的动作。 下面是一个简单的示例代码,可以实现对视频中人体动作的识别: ```python import cv2 import mediapipe as mp # 初始化mediapipe库中的姿势估计模型 mp_pose = mp.solutions.pose.Pose() # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头画面 ret, frame = cap.read() # 将画面转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 使用mediapipe库中的姿势估计模型,对人体姿势进行估计 results = mp_pose.process(gray) # 提取关键点信息 if results.pose_landmarks: # 获取左手腕关键点的位置 left_wrist_x = results.pose_landmarks.landmark[mp.solutions.pose.PoseLandmark.LEFT_WRIST].x left_wrist_y = results.pose_landmarks.landmark[mp.solutions.pose.PoseLandmark.LEFT_WRIST].y # 获取右手腕关键点的位置 right_wrist_x = results.pose_landmarks.landmark[mp.solutions.pose.PoseLandmark.RIGHT_WRIST].x right_wrist_y = results.pose_landmarks.landmark[mp.solutions.pose.PoseLandmark.RIGHT_WRIST].y # 判断手臂是否向上伸展 if left_wrist_y < results.pose_landmarks.landmark[mp.solutions.pose.PoseLandmark.LEFT_ELBOW].y and right_wrist_y < results.pose_landmarks.landmark[mp.solutions.pose.PoseLandmark.RIGHT_ELBOW].y: print("手臂向上伸展") # 显示画面 cv2.imshow('frame', frame) # 按下q键退出程序 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头 cap.release() # 关闭窗口 cv2.destroyAllWindows
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值