基于OpenCV+MediaPipe的手势识别
【精选】【优秀课设】基于OpenCV+MediaPipe的手势识别(数字、石头剪刀布等手势识别)_石头剪刀布opencv识别代码_网易独家音乐人Mike Zhou的博客-CSDN博客
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的手势识别(数字、石头剪刀布等手势识别)_石头剪刀布opencv识别代码_网易独家音乐人Mike Zhou的博客-CSDN博客
相关文章:
基于OpenCV+MediaPipe的手势识别
【精选】【优秀课设】基于OpenCVMediaPipe的手势识别(数字、石头剪刀布等手势识别)_石头剪刀布opencv识别代码_网易独家音乐人Mike Zhou的博客-CSDN博客 import cv2 import mediapipe as mp import mathdef vector_2d_angle(v1, v2):求解二维向量的角度v…...
YOLO目标检测——无人机航拍行人检测数据集下载分享【含对应voc、coc和yolo三种格式标签】
实际项目应用:智能交通管理、城市安防监控、公共安全救援等领域数据集说明:无人机航拍行人检测数据集,真实场景的高质量图片数据,数据场景丰富标签说明:使用lableimg标注软件标注,标注框质量高,…...
数据提取PDF SDK的对比推荐
PDF 已迅速成为跨各种平台共享和分发文档的首选格式,它作为一种数据来源,常见于公司的各种报告和报表中。为了能更好地分析、处理这些数据信息,我们需要检测和提取 PDF 中的数据,并将其转换为可用且有意义的格式。而数据提取的 PD…...
【数据结构(C语言)】浅谈栈和队列
目录 文章目录 前言 一、栈 1.1 栈的概念及结构 1.2 栈的实现 1.2.1. 支持动态增长的栈的结构 1.2.2 初始化栈 1.2.3 入栈 1.2.4 出栈 1.2.5 获取栈顶元素 1.2.6 获取栈中有效元素个数 1.2.7 检查栈是否为空 1.2.8 销毁栈 二、队列 2.1 队列的概念及结构 2.2 队…...
【NGINX--5】身份验证
1、HTTP 基本身份验证 需要通过 HTTP 基本身份验证保护应用或内容。 生成以下格式的文件,其中的密码使用某个受支持的格式进行了加密或哈希处理: # comment name1:password1 name2:password2:comment name3:password3第一个字段是用户名࿰…...
【网络奇缘】- 计算机网络|分层结构|ISO模型
🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分层结构 OSI参考模型 OSI模型起源 失败原因: OSI模型组成 协议的作用 📝全文…...
使用whisper实现语音转文本
项目地址:GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision 1、需要py3.8环境 conda activate p38 2、安装 pip install -U openai-whisper 3、下载项目 pip install githttps://github.com/openai/whisper.git 4、安装…...
Django中间件与csrf
一. django中间件 1. 什么是django中间件 # django中间件是django的门户1. 请求来的时候需要先经过中间件才能到达真正的django后端2. 响应走的时候最后也需要经过中间件才能发送出去 2. django中间件的个数 django自带七个中间件, 分别是SecurityMiddleware, SessionMiddle…...
【搜维尔科技】产品推荐:Virtuose 6D RV,大型工作空间触觉设备
Virtuose 6D RV为一款具有大工作空间并在所有6自由度上提供力反馈的触觉设备,设计专用于虚拟现实环境,特别适合于大型虚拟物体的处理。 Virtuose 6D RV是当今市场上唯一将高工作效率与高工作量相结合在一起的产品。6D RV特别适合于缩放与操纵等应用&…...
<JavaEE> 什么是线程(Thread)?进程和线程有什么区别?
目录 一、线程(Thread)的概念 二、线程存在的意义 2.1 并发编程 2.2 比进程更“轻量” 三、使用线程时应该注意 四、进程和线程的区别 五、Java中的线程和操作系统中的线程是不同的概念 六、多线程编程 一、线程(Thread)的…...
【赠书第7期】从零基础到精通Flutter开发
文章目录 前言 1 安装Flutter和Dart 2 了解Flutter的基础概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 编写你的第一个Flutter应用 3.1 创建一个Flutter项目 3.2 修改默认页面 3.3 添加交互 4 深入学习Flutter高级特性 4.1 路由和导航 4.2 状态管…...
《golang设计模式》第三部分·行为型模式-07-观察者模式(Observer)/发布者—订阅者模式
文章目录 1. 概念1.1 角色1.2 类图 2. 代码示例2.1 代码2.2 类图 1. 概念 观察者(Observer)指当目标对象状态发生变化后,对状态变化事件进行响应或处理的对象。 1.1 角色 Subject(抽象主题): 它可以有多…...
Maven中常用命令以及idea中使用maven指南
文章目录 Maven 常用命令compiletestcleanpackageinstallMaven 指令的生命周期maven 的概念模型 idea 开发maven 项目idea 的maven 配置idea 中创建一个maven 的web 工程在pom.xml 文件添加坐标坐标的来源方式依赖范围编写servlet maven 工程运行调试 Maven 常用命令 compile …...
深度学习之八(生成对抗网络--Generative Adversarial Networks,GANs)
概念 生成对抗网络(Generative Adversarial Networks, GANs)是一种深度学习模型,由 Ian Goodfellow 等人于2014年提出。GAN 的目标是通过训练两个神经网络(生成器和判别器),使得生成器能够生成与真实数据相似的样本,而判别器能够区分真实样本和生成样本。这两个网络相…...
内部网关协议_路由信息协议RIP_开放路径优先OSPF协议_基本知识
目录: 因特网路由选择协议概述 路由信息协议RIP 开放路径优先OSPF协议 因特网路由选择协议概述 一.路由选择分类 静态路由选择和动态路由选择 静态路由选择: 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。静态路由选择简单、开销小&#…...
Linux python安装 虚拟环境 virtualenv
根目录创建 venvs 文件夹 sudo mkdir /venvs 进入 /venvs 目录 cd /venvsp 创建虚拟环境,前提要按照 python3 安装 的 命令 sudo apt install python3 sudo python3 -m venv 虚拟环境名 激活虚拟环境 sourcepippip /venvs/zen-venv/bin/activatepinpi 安装flask pip…...
洛谷 P1883 函数
P1883 函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Error Curves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这两题是一模一样的,过一题水两题。 分析 主要难点在于证明F(x)是一个单峰函数可以被三分,但是我随便画了几个f(x)之后发现好像…...
【C++心愿便利店】No.14---C++之探索list底层原理
文章目录 前言一、list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list operations1.2.7 list的迭代器失效 二、list的模拟实现2.1 定义一个结构体实现list的…...
【广州华锐互动】VR防溺水安全内容体验提高群众防溺水意识
在全球各地,溺水是导致儿童和青少年死亡的主要原因之一。据世界卫生组织的统计,全球每年有超过36万人因溺水而死亡,其中大部分是儿童和青少年。因此,提供有效的防溺水教育和培训至关重要。随着科技的发展,虚拟现实&…...
【Skynet 入门实战练习】游戏模块划分 | 基础功能模块 | timer 定时器模块 | logger 日志服务模块
文章目录 游戏模块基础功能模块定时器模块日志模块通用模块 游戏模块 游戏从逻辑方面可以分为下面几个模块: 注册和登录网络协议数据库玩法逻辑其他通用模块 除了逻辑划分,还有几个重要的工具类模块: Excel 配置导表工具GM 指令测试机器人…...
如何创建PostCSS自定义解析器:轻松扩展新CSS语法的完整指南
如何创建PostCSS自定义解析器:轻松扩展新CSS语法的完整指南 【免费下载链接】postcss Transforming styles with JS plugins 项目地址: https://gitcode.com/gh_mirrors/po/postcss PostCSS作为强大的CSS转换工具,不仅支持标准CSS语法,…...
Draw.io电子工程绘图库完全指南:3步掌握专业电路设计
Draw.io电子工程绘图库完全指南:3步掌握专业电路设计 【免费下载链接】Draw-io-ECE Custom-made draw.io-shapes - in the form of an importable library - for drawing circuits and conceptual drawings in draw.io. 项目地址: https://gitcode.com/gh_mirrors…...
Xdotool:Linux桌面自动化与GUI测试的终极命令行解决方案
Xdotool:Linux桌面自动化与GUI测试的终极命令行解决方案 【免费下载链接】xdotool fake keyboard/mouse input, window management, and more 项目地址: https://gitcode.com/gh_mirrors/xd/xdotool 你是否曾因重复的GUI操作而感到效率低下?是否…...
基于GAM全局注意力机制的YOLOv10多层次特征融合改进:从原理到实践
摘要 在目标检测领域,YOLO系列模型凭借其出色的速度与精度平衡,始终占据着重要地位。然而,传统YOLOv10模型在处理复杂场景下的多尺度目标时,仍存在特征表达能力不足、关键信息丢失等问题。本文提出一种基于GAM(Global Attention Mechanism,全局注意力机制)的YOLOv10改进…...
建行广东江门分行:凭借数字人民币应用,引领校园金融数字化发展
近年来,数字人民币试点工作稳步推进,金融科技与民生场景的融合日益深入。建行广东江门分行将数字人民币试点与教育场景创新深度融合,成功为鹤山某中学量身打造了数字人民币智慧食堂解决方案,开创了“金融教育科技”融合发展的新范…...
防止电瓶车入电梯视频监控解决方案
近日,成都某小区因电动自行车在小区内起火事件,造成严重安全隐患。短短20分钟灭火却夺走5条生命!老旧小区火灾再敲警钟:黑烟如巨兽吞噬生命,电动车充电隐患与逃生知识缺失成致命伤。如何防患于未然? 结合**…...
如何5分钟掌握CPP漫展智能抢票神器:终极自动化解决方案
如何5分钟掌握CPP漫展智能抢票神器:终极自动化解决方案 【免费下载链接】cppTickerBuy cpp cp30 漫展 活动 抢票 无差别 同人展 项目地址: https://gitcode.com/gh_mirrors/cp/cppTickerBuy 你是否曾经在CPP漫展门票开售的瞬间,眼睁睁看着票务页面…...
键盘幽灵键终结者:Keyboard Chatter Blocker深度配置指南
键盘幽灵键终结者:Keyboard Chatter Blocker深度配置指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 当你的机械键盘开始…...
FanControl终极指南:彻底解决Windows电脑风扇噪音的免费神器
FanControl终极指南:彻底解决Windows电脑风扇噪音的免费神器 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trend…...
ILSpy终极指南:免费开源的.NET程序集浏览器和反编译器
ILSpy终极指南:免费开源的.NET程序集浏览器和反编译器 【免费下载链接】ILSpy .NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform! 项目地址: https://gitcode.com/gh_mirrors/il/ILSpy 你是否曾经面对一…...
