基于OpenCV+MediaPipe的手势识别(数字、石头剪刀布等手势识别)

可识别左右手,共定义了15种手势,可以自行增加
通过MediaPipe识别关键点 而后通过计算每根手指的角度来进行手势识别
手势定义按经验来的 通过手指角度来判断是否弯曲或伸直



资源:
download.csdn.net/download/weixin_53403301/83189628

视频:

基于OpenCV+MediaPipe的手势识别(数字、石头剪刀布等手势识别)

代码如下:

import cv2
import mediapipe as mp
import mathdef vector_2d_angle(v1,v2):'''求解二维向量的角度'''v1_x=v1[0]v1_y=v1[1]v2_x=v2[0]v2_y=v2[1]try:angle_= math.degrees(math.acos((v1_x*v2_x+v1_y*v2_y)/(((v1_x**2+v1_y**2)**0.5)*((v2_x**2+v2_y**2)**0.5))))except:angle_ =65535.if angle_ > 180.:angle_ = 65535.return angle_
def hand_angle(hand_):'''获取对应手相关向量的二维角度,根据角度确定手势'''angle_list = []#---------------------------- thumb 大拇指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[2][0])),(int(hand_[0][1])-int(hand_[2][1]))),((int(hand_[3][0])- int(hand_[4][0])),(int(hand_[3][1])- int(hand_[4][1]))))angle_list.append(angle_)#---------------------------- index 食指角度angle_ = vector_2d_angle(((int(hand_[0][0])-int(hand_[6][0])),(int(hand_[0][1])- int(hand_[6][1]))),((int(hand_[7][0])- int(hand_[8][0])),(int(hand_[7][1])- int(hand_[8][1]))))angle_list.append(angle_)#---------------------------- middle 中指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[10][0])),(int(hand_[0][1])- int(hand_[10][1]))),((int(hand_[11][0])- int(hand_[12][0])),(int(hand_[11][1])- int(hand_[12][1]))))angle_list.append(angle_)#---------------------------- ring 无名指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[14][0])),(int(hand_[0][1])- int(hand_[14][1]))),((int(hand_[15][0])- int(hand_[16][0])),(int(hand_[15][1])- int(hand_[16][1]))))angle_list.append(angle_)#---------------------------- pink 小拇指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[18][0])),(int(hand_[0][1])- int(hand_[18][1]))),((int(hand_[19][0])- int(hand_[20][0])),(int(hand_[19][1])- int(hand_[20][1]))))angle_list.append(angle_)return angle_listdef h_gesture(angle_list):'''# 二维约束的方法定义手势# fist five gun love one six three thumbup yeah'''thr_angle = 65.  #手指闭合则大于这个值(大拇指除外)thr_angle_thumb = 53.  #大拇指闭合则大于这个值thr_angle_s = 49.  #手指张开则小于这个值gesture_str = "Unknown"if 65535. not in angle_list:if (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "0"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "1"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "2"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]>thr_angle):gesture_str = "3"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "4"elif (angle_list[0]<thr_angle_s) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "5"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "6"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "8"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Pink Up"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Thumb Up"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Fuck"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "Princess"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Bye"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Spider-Man"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Rock'n'Roll"return gesture_strdef detect():mp_drawing = mp.solutions.drawing_utilsmp_hands = mp.solutions.handshands = mp_hands.Hands(static_image_mode=False,max_num_hands=1,min_detection_confidence=0.75,min_tracking_confidence=0.75)cap = cv2.VideoCapture(0)while True:ret,frame = cap.read()frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)frame= cv2.flip(frame,1)results = hands.process(frame)frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)if results.multi_handedness:for hand_label in results.multi_handedness:hand_jugg=str(hand_label).split('"')[1]print(hand_jugg)cv2.putText(frame,hand_jugg,(50,200),0,1.3,(0,0,255),2)if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)hand_local = []for i in range(21):x = hand_landmarks.landmark[i].x*frame.shape[1]y = hand_landmarks.landmark[i].y*frame.shape[0]hand_local.append((x,y))if hand_local:angle_list = hand_angle(hand_local)gesture_str = h_gesture(angle_list)print(gesture_str)cv2.putText(frame,gesture_str,(50,100),0,1.3,(0,0,255),2)cv2.imshow('MediaPipe Hands', frame)if cv2.waitKey(1) & 0xFF == 27:breakcap.release()cv2.destroyAllWindows()
if __name__ == '__main__':detect()

【优秀课设】基于OpenCV+MediaPipe的手势识别(数字、石头剪刀布等手势识别)相关推荐

  1. 【优秀课设】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别 视频随时标注)

    基于OpenCV的Python人脸识别.检测.框选 (遍历目录下所有照片依次识别 视频随时标注) 移步: https://blog.csdn.net/weixin_53403301/article/d ...

  2. 【优秀毕设】基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发、可基于树莓派)

    [优秀毕设]基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发.可基于树莓派) 该系统利用Harr级联检测和LPBH进行人脸检测和训练.识别 利用Tkinter完成界面搭建 利用Fla ...

  3. 使用Python基于OpenCV+MediaPipe追踪手势并控制音量

    利用Python基于OpenCV+MediaPipe追踪手势并实现控制音量 写在前面 说明 简介 1.OpenCV简介 2.MediaPipe简介 3.配置环境 开发环境 所需的库 最终效果演示 手部 ...

  4. 【优秀课设】基于OpenCV-Python的树莓派人脸识别及89C52单片机控制系统设计(指定照片进行识别、遍历目录下所有照片依次识别)

    基于OpenCV-Python的树莓派人脸识别及89C52单片机控制系统设计 (指定照片进行识别) 参照之前的文章所改进 增加视频随时标注功能 https://blog.csdn.net/weixin ...

  5. 记大学计网课设——基于B/S架构的视频点播系统设计

    中南大学 计算机网络课程设计报告 题    目 基于WEB的视频点播系统设计 学生姓名 指导教师 学    院 信息科学与工程学院 专业班级 二○一七 年 九 月 目录 一.需求分析...5 1.题目 ...

  6. 吉林大学软件学院c++优秀课设资源讲解

    1.介绍 课程设计目的: 1.熟悉利用面向对象的方法以及C++的编程思想来完成系统的设计: 2.锻炼学生在设计的过程中,建立清晰的类层次,应用继承和多态等面向对象的编程思想: 3.通过本课程设计,加深 ...

  7. 嵌入式课设-基于GPS模块的校园定位程序

    文章目录 前言 一.环境与设备配置 二.使用步骤 1.使用QT编写相关程序 2.运行 在这里插入图片描述 总结 前言 一个简单的基于GPS模块的校园定位程序的嵌入式课设. 一.环境与设备配置 首先下载 ...

  8. imut FPGA课设 基于FPGA的VGA弹球游戏设计 *秋昊

    写在前面的话: 本文主要呈现了一篇IMUT的FPGA课设报告. 课设报告内容(word版),视频演示,程序源码,专业创新实践简介,专业创新实践指导书均已放入下面的百度云链接中,也不大,总共不到20MB ...

  9. [NUAA]数据库课设-基于OpenGauss的简易网络小说平台

    文章目录 前言 一.课设题目要求及分析 二.小说平台实现效果 1.合理的角色功能划分 2. 表结构的设计 3.Python如何与服务器进行连接 4.flask框架的应用 4.1 前端页面如何传递信息给 ...

  10. 单片机课设基于51单片机的波形发生器(公开资源)(四种波形)(同时输出两种波形)

    单片机课设-波形发生器 前言 一.课设任务是什么? 二.如何解决这几个任务? 三.仿真原理图 四.代码 4.1 LCD1602代码 4.2 波形输出以及8*8点阵显示代码 4.3 波形选择 五.仿真源 ...

最新文章

  1. 是否可以人为修改发表时间
  2. linux内核实验平台搭建,搭建自己的Linux实验系统(一)
  3. Git clone时出现Please make sure you have the correct access rights and the repository exists.问题已解决。...
  4. 你的pyc文件,泄露了你的秘密!
  5. 在颜值上,我 Bootstrap 真的没怕过谁
  6. campaign read in WebUI - Fiori is correct!
  7. 基础拾遗------泛型详解
  8. 计算机网络概述的功能 组成,计算机网络的概述
  9. 为什么感觉每年手机都在升级CPU,但始终都会卡顿?
  10. 大数据时代激活数据管理新思路
  11. vue elementui表格数据
  12. Python2/3共存,pip2/3共存
  13. 参加一场 Google IO 需要多少资金?
  14. IBM核心软件如何应对“互联网+”的技术挑战
  15. 记一个单双引号的特别用法
  16. 轻松盘,资产盘点不再难 RFID办公资产盘点管理
  17. 运营商5G商业模式研究
  18. mysql左右匹配原则的用法和理解
  19. 路由跳转后需要两次调用goback才能正常返回
  20. win10添加mysql8环境变量_win10下mysql8.0.12安装及环境变量配置教程

热门文章

  1. 综合架构——网站服务
  2. 杨永信和他荒唐至极的 “网瘾电击疗法”
  3. 微软Hololens学院教程-Hologram 212-Voice(语音)【微软教程已经更新,本文是老版本】...
  4. 下拉菜单选择城市列表html,js弹出式下拉列表框选择省市地区美化插件 - pickout.js...
  5. irving - 初学python
  6. GitChat 是一个怎样的产品?
  7. meta html 自动跳转,meta标签http-equiv=“Refresh”纯html网页跳转用法详解
  8. 微电子电路——PMOS网表详解
  9. Android系统原理及开发要点详解
  10. 高数笔记(四):导数概念,函数的求导法则,高阶导数,隐函数求导、参数方程求导