基于mediapipe的手势游戏控制

基于mediapipe的手势游戏控制

​ 玩游戏,那不是有手就行!!!

mediapipe介绍

​ Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架,用于构建基于机器学习的应用程序,特别是涉及到计算机视觉、音频处理、姿势估计等领域。Mediapipe实际上是一个集成的机器学习视觉算法的工具库(包含人脸检测、人脸关键点、手势识别、头像分割和姿态识别等各种模型),该库提供了一系列预训练模型和工具,可以帮助开发者快速构建和部署计算机视觉和音频处理应用。它提供了一套易于使用的API,可以用于实时姿势估计、手势识别、面部识别、目标跟踪等任务。

手势捕捉

​ 项目地址: https://github.com/google/mediapipe

​ pip安装mediapipe、opencv:

pip install mediapipe
pip install opencv-python

在文件中引入依赖

import cv2
import mediapipe as mp

通过cv2打开摄像头获取影像,电脑默认的输入是0,如果有其他输入通过更改序号来切换输入设备。

cap = cv2.VideoCapture(0)

初始化手势捕捉需要用到的对象

mpHands = mp.solutions.hands
hands = mpHands.Hands()
# 用于将识别到的点坐标绘制到输入的图片上
mpDraw = mp.solutions.drawing_utils 

写一个死循环,频繁监听摄像头输入并对手势进行绘制

while True:
	ret, img = cap.read()
	if ret:
		# cv2默认获取的图片是BGR的颜色通道,需要将其转换为RGB
		imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
		# 对图像进行识别
        result = hands.process(imgRGB)
        
        if result.multi_hand_landmarks:
        	# 遍历出现的手,这边仅用一只手进行操控,所以这边应该只有一个
        	for handLms in result.multi_hand_landmarks:
        		# 将识别到的手势坐标点绘制到获取的图像上 mpHands.HAND_CONNECTIONS是将所有坐标点连接起来
        		mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
       	# 将操作后的图像显示在屏幕上
        cv2.imshow('img', img)

最终的效果如下

请添加图片描述

返回的结果每个点都有固定的序号,我们将序号也固定在图像上,方便我们观察每个序号处于什么节点。

先获取原始图像的高和宽

imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
imgHeight = img.shape[0]
imgWidth = img.shape[1]

在绘制手部坐标后,对坐标点进行遍历,得到每个点的坐标。

for i, lm in enumerate(handLms.landmark):
    xPos = int(lm.x * imgWidth)
    yPos = int(lm.y * imgHeight)
    cv2.putText(img, str(i), (xPos - 25, yPos + 5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 2)

绘制出来如图所示:

请添加图片描述

可以看到他是从手根部开始计数,按照拇指、食指、中指…的顺序进行排列,这样我们可以知道如果我们想要获取到某个位置的坐标应该用那个序号进行获取。

手势控制

上面我们获取到了每个节点的坐标,实际上我们只需要以一个点为参照就可以知道手是在向什么方向移动,因为在手势不变的情况下每个点的相对位置是基本一致的,所以我们只需要分析某个点的坐标移动,就可以得出手部的移动趋势。

例如我们固定以拇指的顶部,也就是图中的4号节点作为参照点分析,记录上一次的X轴坐标, 然后每次移动跟上一次做比较如果大于上一次则向右移动了,小于上次则向左移动了。

分析完手的移动意图后我们就可以使用pynput模拟键盘输入了。这边仅提供一个思路,具体的轨迹分析移动距离是一个大工程,简单代码实际得出来的操控体验不佳。

pip install pynput
from pynput.keyboard import Controller
import time
# 模拟按下键盘的D键
keyboard = Controller()

 keyboard.press('d')
 time.sleep(0.2)
 keyboard.release('d')

避免频繁输入,控制一个移动阈值,当移动的距离小于阈值时不进行按键输入。

最终效果如下,实际体验烂得一匹,动画中手部视频延迟于游戏是因为每次按键输入都有延迟,然后才会把手部图像输出到屏幕上,所以看上去手还没动,车把手就动了,现实其实还是蛮跟手的,但是没有什么用,就是图一乐。

请添加图片描述

结语

​ 扩展一下,当我们握拳时,手指顶部的坐标和手掌根部的坐标相对距离会缩短,那我们也可以根据这个特性使用握拳以及张开程度来控制油门。再扩展一下,可以训练一个检测姿态的模型,检测人在骑着某个东西的时候身体的倾斜,同时输入到游戏中,是不是更有代入感一些。想要实现这些并且有一个还不错的游戏体验,需要大量时间进行调试,时间成本以及知识库都是一个大考验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954429.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

015: 深度学习之正向传播和反向传播

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一节介绍了训练和推理的概念,这一节接着训练和推理的概念讲一下,神经网络的正向传播和反向传播。 正反向传播 其实单看正向传播和反向传播这两个…

2025.1.15——二、字符型注入

一、基本操作:整理已知信息,本题为字符型注入 二、解题步骤 step 1:确认为字符型注入 键入: 1 键入:1 and 12 # 发现报错 键入:1 and 11 # 未发现报错 所以确认为字符型注入 step 2:查询…

UML系列之Rational Rose笔记四:时序图(顺序图_序列图)

时序图有很多画法,这基本上能算rose里面要求最乱的一种图了;有些人的需求是BCE模式,这是正常规范点的,有些人就不需要,有些需要用数据库交互,有些不需要;没有一个较为统一的需求;在此…

LabVIEW水位监控系统

LabVIEW开发智能水位监控系统通过集成先进的传感技术与控制算法,为工业液体存储提供精确的水位调控,保证了生产过程的连续性与安全性。 项目背景 在化工和饮料生产等行业中,水位控制的准确性对保证生产安全和提高产品质量至关重要。传统的水…

STC的51单片机LED点灯基于KEIL

前言: 该文源于回答一个朋友的问题,代码为该朋友上传,略作修改,在此说明问题以及解决问题的思路,以减少新手错误。 电路图: 该位朋友未上传电路图,说明如下: stc8g1k08a-sop8控制…

基于YOLOv8的卫星图像中船只检测系统

基于YOLOv8的卫星图像中船只检测系统 (价格90) 使用的是 MASATI-V2 数据集 训练集 3617张 验证集 452张 测试集 453张 包含 [boat] [船只] 1个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系…

用 Python 自动化处理日常任务

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器: 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu?” q&a🔗:https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

python中的RPA->playwright自动化录制脚本实战案例笔记

playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令: playwright codegen…

【原创】大数据治理入门(2)《提升数据质量:质量评估与改进策略》入门必看 高赞实用

提升数据质量:质量评估与改进策略 引言:数据质量的概念 在大数据时代,数据的质量直接影响到数据分析的准确性和可靠性。数据质量是指数据在多大程度上能够满足其预定用途,确保数据的准确性、完整性、一致性和及时性是数据质量的…

数据结构(Java版)第八期:LinkedList与链表(三)

专栏:数据结构(Java版) 个人主页:手握风云 目录 一、链表中的经典面试题 1.1. 链表分割 1.2. 链表的回文结构 1.3. 相交链表 1.4. 环形链表 一、链表中的经典面试题 1.1. 链表分割 题目中要求不能改变原来的数据顺序,也就是如上图所示。…

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…

MPLS原理及配置

赶时间可以只看实验部分 由来:90年代中期,互联网流量的快速增长。传统IP报文依赖路由器查询路由表转发,但由于硬件技术存在限制导致转发性能低,查表转发成为了网络数据转发的瓶颈。 因此,旨在提高路由器转发速度的MPL…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【327-337】

327. 断点调试(Debug) 一个实际需求 在开发中,程序员在查找错误时,可用断点模式在断点调试过程中,是运行状态,是以对象的运行类型来执行的。 A extends B; B b new A(); b.xx();//按照运行类型来执行的 …

Qt 各版本选择

嵌入式推荐用 Qt4.8,打包的程序小:Qt4.8.7是Qt4的终结版本,是Qt4系列版本中最稳定最经典的 最后支持xp系统的长期支持版本:Qt5.6.3;Qt5.7.0是最后支持xp系统的非长期支持版本。 最后提供mysql数据库插件的版本&#xf…

常见好用的PHP CMS开源系统有哪些?

开源的系统,网站大家估计也见过很多,尤其是用PHP写的开源系统也很受用户们欢迎,这类系统通常以简单、使用、开源为优势,为用户提供更好的服务。以下就为大家介绍几个常见且好用的PHP CMS开源系统。欢迎补充! 1、WordP…

DuckDB:精通Insert语句处理数据冲突

本文介绍DuckDB insert语句用法,包括常规的批量插入,尤其是插入数据冲突的处理,最后还提及returning子句的用法,每个用法提供示例说明。 insert插入数据 INSERT INTO向表中插入新行。可以插入由值表达式指定的一行或多行&#xf…

【spring mvc】文件上传、下载

文件上传,存储至本地目录中 一、代码1、工具类(敏感后缀过滤)2、文件上传,存储至本地3、文件下载 二、效果演示1、上传1.1、postMan 请求1.2、上传效果 2、下载2.1、下载效果 一、代码 1、工具类(敏感后缀过滤&#x…

Ansible实战:如何正确选择 command 和shell模块?

在使用Ansible进行自动化运维时,command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似,但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率,还能帮助我们规避一些潜在的风险。在这篇文章…

手撕Transformer -- Day7 -- Decoder

手撕Transformer – Day7 – Decoder Transformer 网络结构图 目录 手撕Transformer -- Day7 -- DecoderTransformer 网络结构图Decoder 代码Part1 库函数Part2 实现一个解码器Decoder,作为一个类Part3 测试 参考 Transformer 网络结构 Decoder 代码 Part1 库函数…