基于mediapipe的手势游戏控制

news2025/1/16 4:09:50

基于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')

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

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

请添加图片描述

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装软件缺少msvcp110.dll怎么办?出现dll丢失的解决方法

在日常使用电脑安装各类软件的过程中,相信不少朋友都遇到过 “缺少 msvcp110.dll” 的报错提示 。下面就来深入聊聊这个 msvcp110.dll 文件,以及当它缺失时,我们该如何巧妙应对。 一、msvcp110.dll 文件介绍 1.1 定义与功能 msvcp110.dll 是…

(学习总结19)C++11 列表初始化、右值引用、移动语义、引用折叠与完美转发

C11 列表初始化、右值引用、移动语义、引用折叠与完美转发 一、列表初始化C98 传统的 {}C11 中的 {}C11 中的 std::initializer_listC11 {} 列表初始化 与 std::initializer_list 区别 二、右值引用左值和右值左值引用和右值引用引用延长生命周期左值和右值的参数匹配类型分类 …

从0开始学习搭网站第二天

前言:今天比较惭愧,中午打铲吃了一把,看着也到钻二了,干脆顺手把这个赛季的大师上了,于是乎一直到网上才开始工作,同样,今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

ffmpeg硬件编码

使用FFmpeg进行硬件编码可以显著提高视频编码的性能,尤其是在处理高分辨率视频时。硬件编码利用GPU或其他专用硬件(如Intel QSV、NVIDIA NVENC、AMD AMF等)来加速编码过程。以下是使用FFmpeg进行硬件编码的详细说明和示例代码。 1. 硬件编码支…

【高可用自动化体系】自动化体系

架构设计的愿景就是高可用、高性能、高扩展、高效率。为了实现架构设计四高愿景,需要实现自动化系统目标: 标准化。 流程自助化。 可视化:可观测系统各项指标、包括全链路跟踪。 自动化:ci/cd 自动化部署。 精细化&#xff1a…

elasticsearch中IK分词器

1、什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器分词方式StandardAnalyzer单字分词CJKAnalyzer二分法IKAnalyzer词库分词 分词∶即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库…

arcgis中生成格网矢量带高度

效果 1、数据准备 (1)矢量边界(miain.shp) (2)DEM(用于提取格网标高) (3)DSM(用于提取格网最高点) 2、根据矢量范围生成格网 模板范围选择矢量边界,像元宽度和高度根据坐标系来输入,我这边是4326的,所以输入的是弧度,输出格网矢量gewang.shp 3、分区统计 …

一文了解如何使用 DBeaver 管理 DolphinDB

在日常的数据开发、分析和数据库运维中,一款优秀的 IDE 能够极大地提升工作效率。DBEaver 是一款由 Java 编写的一站式跨平台连接器,其社区版本已能支持连接近百种数据库,受到广大开发者的喜爱。近期。DolphinDB 与 DBeaver 团队共同努力&…

【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表

本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…

JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

ZGC ZGC 收集器是一个可伸缩的、低延迟的垃圾收集器,基于 Region 内存布局的,不设分代,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记压缩算法 在 CMS 和 G1 中都用到了写屏障,而 ZGC 用到了读屏障 染色指针&a…

C# XPTable 日期字段处理(XPTable控件使用说明十三)

1、SQLite数据库定义为日期类型 2、XPtable中日期字段定义与显示 //显示时间表columnModel1.Columns.Clear();columnModel1.Columns.Add(new NumberColumn("id", 30));NumberColumn numberColumn new NumberColumn("次数", 50);numberColumn.Maximum 100…

【pycharm发现找不到python打包工具,且无法下载】

发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …

晨辉面试抽签和评分管理系统之六:面试答题倒计时

晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

王炸组合:Dolphinscheudler 3.1.*搭配SeaT unnel2.3.*高效完成异构数据数据集成

概述 本篇主要介绍如何通过Dolphinscheduler海豚调度搭配Seatunnel完成异构数据源之间的数据同步功能,这个在大数据流批一体数仓建设的过程中是一个非常好的解决方案, 稳定高效,只要用上了你肯定爱不释手。 环境准备 dolphinscheduler集群…

【AI日记】25.01.11 Weights Biases | AI 笔记 notion

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Forecasting Sticker Sales笔记:我的 AI 笔记主要记在两个地方 有道云笔记:数学公式和符号比较多的笔记notion:没什么数学公式的…

Oracle EBS GL定期盘存WIP日记账无法过账数据修复

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状 用户反映来源为“定期盘存”和类别为“WIP”的日记账无法过账,标准日记账的界面上的过账按钮灰色不可用。但是,在超级用户职责下,该日记账又可以过账,细心检查发现该业务实体下有二个公司段值15100和…

欧拉路径算法

欧拉图: 对于应该连通图G,有: 1欧拉路径:一条路径,它能够不重复地遍历完所有的边,这个性质很像不重复地一笔画完所有边,所以有些涉及到欧拉路径的问题叫做一笔画问题。 2欧拉回路&#xff1a…

【进程与线程】程序和进程在内存中的表现

在计算机系统中,程序和进程是两个密切相关但又有本质区别的概念,尤其在内存中的表现上有显著不同: 在这张图中可以直观地看出程序和进程在内存中的结构区别。 基本定义 程序 程序 是一个 静态实体,表示一组写好的指令和数据的…

“多维像素”多模态雷视融合技术构建自动驾驶超级感知能力|上海昱感微电子创始人蒋宏GADS演讲预告

2025年1月14日,第四届全球自动驾驶峰会将在北京中关村国家自主创新示范区展示交易中心-会议中心举行。经过三年的发展,全球自动驾驶峰会已经成长为国内自动驾驶领域最具影响力、规模最大的产业峰会之一。昱感微电子创始人&CEO受到主办方邀请&#xf…

Linux创建server服务器实现多方信息收发

一,服务端 1.创建socket套接字,用于网络通信,同一台机器上的进程也可以通过本地套接字进行通信 //1.socket s_fd socket(AF_INET,SOCK_STREAM,0); if(s_fd -1){ perror("socket"); exit(-1); } //server address s_addr.sin_fami…