当前位置: 首页 > news >正文

基于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的颜色通道,需要将其转换为RGBimgRGB = 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')

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

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

请添加图片描述

结语

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

相关文章:

基于mediapipe的手势游戏控制

基于mediapipe的手势游戏控制 ​ 玩游戏,那不是有手就行!!! mediapipe介绍 ​ Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架,用于构建基于机器学习的应用程序,特别是涉及到计算机视觉、音频处理、姿势估计等领域。…...

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…...

IEC103 转 ModbusTCP 网关

一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 ,是三格电子推出的工业级网关(以下简 称网关),主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集, IEC103 支持遥测和遥 信,可接…...

docker swarm 部署问题 和 指定节点部署服务

问题原因: docker swarm 部署遇到的问题, 先前docker compose部署,分别创建了 cloud 网络; 昨进行swarm 集群部署;只是删了57 机器cloud 网络;在创建swarm集群后创建cloud 58机器 没有删除先前的cloud 网络…...

09.VSCODE:安装 Git for Windows

在 Windows 下安装著名的源代码管理工具:git。 git 工具两大作用: 管理我们自己的源代码获取他人(开源的)源代码 当前我们更需要第2点。 为什么要安装 git 一、 得到更多库 之前课程中我们安装了 msys2,从而可以通…...

基于R计算皮尔逊相关系数

# 基于R计算皮尔逊相关系数 # 函数 基本基本函数 cor.test ## 两组数据读入 xread.csv("1.csv",header T) yread.csv("2.csv",header T) ## 计算 cor.test(1,2,method"pearson") 结果 Pearsons product-moment correlationdata: 1 and 2…...

vue 纯前端导出 Excel

方法一: 1、安装"file-saver" npm i -S file-saver xlsx 2、引入 在需要导出功能的 .vue 文件中引入 import FileSaver from "file-saver"; import XLSX from "xlsx"; 3、简单示例(复制即可食用)&#x…...

APISQL在线一键安装教程

本文档将指导您在 Linux 服务器上使用 Docker 安装 APISQL 软件。提供了两种安装方式:在线安装和离线安装,您可以根据实际环境选择合适的安装方式。 1. 准备工作 1.1 硬件要求 Linux (x86_64) 服务器 1.2 软件要求 Docker Engine 推荐版本&#xff…...

数据结构《MapSet哈希表》

文章目录 一、搜索树1.1 定义1.2 模拟实现搜索 二、Map2.1 定义2.2 Map.Entry2.3 TreeMap的使用2.4 Map的常用方法 三、Set3.1 定义3.2 TreeSet的使用3.3 Set的常用方法 四、哈希表4.1 哈希表的概念4.2 冲突4.2.1 冲突的概念4.2.2 冲突的避免1. 选择合适的哈希函数2. 负载因子调…...

【PCL】sample_consensus 模块—— Random Sample Consensus model(随机样本一致性模型,RANSAC)

1、随机样本一致性模型(RANSAC)简介 在本教程中,我们将学习如何使用带有平面模型的随机样本一致性(RANSAC)来获取适合该模型的点云。 1.1理论背景 RANSAC 是“随机样本一致性”(RANdom SAmple Consensus…...

【MATLAB代码】CV和CA模型组成的IMM(滤波方式为UKF),可复制粘贴源代码

该代码实现了一维无迹卡尔曼滤波器(UKF)与交互式多模型(IMM)结合的状态估计。代码分为多个部分,主要功能包括参数定义、观测数据生成、状态估计、模型更新以及结果可视化。 文章目录 运行结果程序代码主要功能代码结构应用场景注意事项运行结果 程序代码 下方源代码直接粘…...

docker-compose部署kafka 3.3.1 kraft

一、服务器: 节点1:10.1.1.165 节点2:10.1.1.164 节点3:10.1.1.169二、添加环境地址解析 vim /etc/hosts kafka1 10.1.1.165 kafka2 10.1.1.164 kafka3 10.1.1.169三、节点配置 节点1 version: "3" services:kafka1:image: bitnami/kafka:3.3.1contain…...

Linux 串口检查状态的实用方法

在 Linux 系统中,串口通信是非常常见的操作,尤其在嵌入式系统、工业设备以及其他需要串行通信的场景中。为了确保串口设备的正常工作,检查串口的连接状态和配置信息是非常重要的。本篇文章将介绍如何在 Linux 上检查串口的连接状态&#xff0…...

使用FRP进行内网穿透

一、基本概念 内网穿透:它是一种网络技术或方法,旨在允许外部网络(如互联网)访问位于内部网络(内网)中的设备或服务。由于内部网络通常处于NAT(网络地址转换)、防火墙或其他安全机制…...

Ubuntu打开文件夹不显示文件

1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容,而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus...

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)

在HarmonyOS NEXT开发环境中,可以使用nutpi/axios库来简化网络请求的操作。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库,从零开始实现一个简单的影视APP,主要关注影视搜索页的功能实现。 为什么选择nutpi/axios? nutpi…...

探秘 JMeter 前置处理器:让性能测试如虎添翼

想象一下,你是一位超级英雄,要对一个庞大的虚拟城市(Web 应用)进行全面的 “健康检查”。JMeter 就是你的神奇工具包,而其中的前置处理器,就像是这个工具包里的各种超级武器,能帮助你轻松应对各…...

如何在gitlab cicd中实现每月10号上午执行

在 GitLab CI/CD 中,可以通过设置定时触发器(Schedules)和脚本中的时间判断逻辑结合,确保任务只在每月 10 号的上午运行。 以下是实现的步骤: 1. 设置定时触发器 GitLab 提供了 Schedules 功能,可以指定每…...

深度学习基础知识

深度学习是人工智能(AI)和机器学习(ML)领域的一个重要分支,以下是对深度学习基础知识的归纳: 一、定义与原理 定义:深度学习是一种使计算机能够从经验中学习并以概念层次结构的方式理解世界的机…...

面试加分项:Android Framework AMS 全面概述和知识要点

第一章:AMS 的架构与组件 1.1 AMS 整体架构 在 Android 系统的庞大体系中,AMS(Activity Manager Service)就如同一个中枢神经系统,是整个系统的核心服务之一,对应用的性能和用户体验有着直接且关键的影响 。它的整体架构由 Client 端和 Service 端两大部分组成,这两端相…...

网安——CSS

一、CSS基础概念 CSS有两个重要的概念,分为样式和布局 CSS的样式分为两种,一种是文字的样式,一种是盒模型的样式 CSS的另一个重要的特质就是辅助页面布局,完成HTML不能完成的功能,比如并排显示或精确定位显示 从HT…...

知识图谱常见的主流图数据库

在知识图谱中,主流使用的图数据库包括以下几种: Neo4j:这是目前全球部署最广泛的图数据库之一,具有强大的查询性能和灵活的数据模型,适用于复杂关系数据的存储和查询。 JanusGraph:JanusGraph是一个开源的…...

阀井可燃气体监测仪,开启地下管网安全新篇章-旭华智能

在城市的脉络中,地下管网犹如隐秘的动脉,支撑着现代生活的运转。而在这庞大网络的关键节点上,阀井扮演着不可或缺的角色。然而,由于其密闭性和复杂性,阀井内部一旦发生可燃气体泄漏,将对公共安全构成严重威…...

【6】Word:海名公司文秘❗

目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换:粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列,单机右键…...

微信原生小程序自定义封装组件(以导航navbar为例)

封装 topnav.js const App getApp(); Component({// 组件的属性列表properties: {pageName: String, //中间的titleshowNav: { //判断是否显示左上角的按钮 type: Boolean,value: true},showHome: { //判断是否显示左上角的home按钮type: Boolean,value: true},showLocat…...

<OS 有关>Ubuntu 24 安装 openssh-server, tailscale+ssh 慢增加

更新日志: Created on 14Jan.2025 by Dave , added openssh-server, tailescape Updated on 15Jan.2025, added "tailescape - tailscape ssh" 前期准备: 1. 更新可用软件包的数据库 2. 升级系统中所有已安装的软件包到最新版本 3. 安装 cur…...

HQL(JPQL)和原生SQL实现查询自定义返回类

维修申请实例RepairApplyInstance: package com.byx.scaffold.common.entity.jpa;import com.byx.scaffold.common.entity.jpaEnum.RepairStatusConstant; import lombok.Data;import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence…...

微信小程序 实现拼图功能

微信小程序 实现拼图 效果示例功能描述代码示例 效果示例 微信小程序 碎片拼图 功能描述 在微信小程序中,实现一个简单的拼图小游戏。用户需要将四张碎片图片拖动到目标图片的正确位置,具体功能如下: 拖动功能: 用户可以通过手指…...

《C++11》并发库:简介与应用

在C11之前,C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方库(如Boost.Thread)来创建和管理线程。这些方式存在以下几个问题: …...

【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍

从帝国理工的PPT学习。 什么是RDMA Remote Direct Memory Access,也就是Remote的DMA,是一种硬件机制,能直接访问远端结点的内存,而不需要处理器介入。 其中: Remote:跨node进行数据传输Direct&#xff…...

Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件

通过 SSH 隧道将远程端口转发到本地机器 输入服务器示例的SSH指令和密码,将远程的6006端口代理到本地 在服务器终端,激活conda虚拟环境 conda activate posecnnexport PYOPENGL_PLATFORMegljupyter notebook --no-browser --port6006 --allow-root从…...

【Linux】常见指令(一)

Linux常见指令 01.whoami02.pwd03.ls04.mkdir05.cd 本文LInux环境为,使用XShell远程登陆到Linux。 具体如何环境搭建,大家可以查看其他博客。 01.whoami whoami 指令用来查看当前账户是谁。 如上图所示,使用whoami指令,查看到现在…...

AI学习之自然语言处理(NLP)

自然语言处理(Natural Language Processing,NLP)是计算机科学、人工智能和语言学领域的交叉学科,旨在让计算机能够理解、处理和生成人类语言。以下为你详细介绍: 自然语言处理的关键技术 词法分析:将文本…...

全面解析锁服务设计:内存锁、数据库锁与分布式锁的选择与实现

在构建分布式系统时,锁服务通常用于控制多个线程或进程对共享资源的访问。为了灵活适配不同的锁实现方式,我们可以设计一个基础的锁服务接口,然后根据需求提供不同的实现。例如,内存锁、数据库锁和分布式锁。 1. 锁服务基础接口设…...

jenkins-系统配置概述

一. 引文: Jenkins除了强大的功能插件实现的持续交付集成外, 本身也是有一些比较重要的可配项。 接下来我们来看一看。 配置入口: 系统管理-->系统设置 二. 基础配置: 1.主目录(home directory): Jenkins所有的数据文件存放路径(可通过…...

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 数据之道,路漫漫其修远兮,吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准:准确、有…...

kafka消费堆积问题探索

背景 我们的商城项目用PHP写的,原本写日志方案用的是PHP的方案,但是,这个方案导致资源消耗一直降不下来,使用了20个CPU。后面考虑使用通过kafka的方案写日志,商城中把产生的日志丢到kafka中,在以go写的项目…...

一文掌握Docker

目录 1.快速入门 1.1.部署MySQL 1.2.命令解读 2.Docker基础 2.1.常见命令 2.1.1.命令介绍 2.1.2.演示 2.1.3.命令别名 2.2.数据卷 2.2.1.什么是数据卷 2.2.2.数据卷命令 2.2.3.挂载本地目录或文件 2.3.镜像 2.3.1.镜像结构 2.3.2.Dockerfile构建镜像 2.3.3.构建…...

慧集通(DataLinkX)iPaaS集成平台-系统管理之UI库管理、流程模板

UI库管理 UI库管理分为平台级和自建两种,其中平台级就是慧集通平台自己内置的一些ui库所有客户均可调用,自建则是平台支持使用者自己根据规则自己新增对应的UI库。具体界面如下: 自建UI库新增界面: 注:平台级UI库不支…...

【学习笔记】Macbook管理多个不同的Python版本

在MacBook上管理不同项目的不同Python版本,可以使用多种方法。以下是一些常见的方法: 1. 使用 pyenv pyenv 是一个非常流行的工具,可以让你轻松安装和切换多个Python版本。以下是安装和使用 pyenv 的步骤: 安装 pyenv 安装依赖…...

前端如何设计一个回溯用户操作的方案

同一个项目,为什么我本地无法复现,只有客户的设备才复现? 如何获取用户的操作路径呢? 两种方案:埋点和rrweb 埋点就很简单了,将所有可能操作的节点都进行预埋数据;但埋点简单并不省心&#xff…...

WPF、控件模板(ControlTemplate)和数据模板(DataTemplate)

前言 在 WPF 中,控件种类丰富且功能非常完善。一个显著的优点是 WPF 提供了强大的自定义能力和灵活的用户界面表现,能够满足各种复杂的应用需求。其中,ControlTemplate 和 DataTemplate 是两个非常重要的概念,分别用于自定义控件…...

MAC上安装Octave

1. 当前最新版Octave是9.3版本,需要把mac os系统升级到14版本(本人之前的版本是10版本) https://wiki.octave.org/Octave_for_macOS octave的历史版本参考此文档:Octave for macOS (outdated) - Octavehttps://wiki.octave.org/Oc…...

RabbitMQ(三)

RabbitMQ中的各模式及其用法 工作队列模式一、生产者代码1、封装工具类2、编写代码3、发送消息效果 二、消费者代码1、编写代码2、运行效果 发布订阅模式一、生产者代码二、消费者代码1、消费者1号2、消费者2号 三、运行效果四、小结 路由模式一、生产者代码二、消费者代码1、消…...

一体机cell服务器更换内存步骤

一体机cell服务器更换内存步骤: #1、确认grdidisk状态 cellcli -e list griddisk attribute name,asmmodestatus,asmdeactivationoutcome #2、offline griddisk cellcli -e alter griddisk all inactive #3、确认全部offline后进行关机操作 shutdown -h now #4、开…...

年后找工作需要注意的事项

大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | A…...

【网络 MAC 学习专栏 -- 如何理解 PHY 的 Link Up】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewClause 22/Clause 45Clause 22Clause 45 PHY Link 状态的软件实现 转自: 开心果 Need Car 2022年10月20日 09:50 上海 Overview PHY…...

鸿蒙UI开发——文本级联选择器

1、概 述 ArkUI提供了一个文本选择器(showTextPickerDialog),可以方便的实现文本级联选择,例如:省->市->区,示意如下: 下面针对文本选择器做简单介绍。 2、接口介绍 定义文本滑动选择器…...

后盾人JS -- JS运算符与流程控制

嘻嘻 赋值运算符与算术运算符 没什么好说的&#xff0c;等号谁都会用 比较运算符注意事项 如果一个是字符一个是数字也是可以比较的&#xff08;&#xff09; 是判断值和类型是否相等 <!DOCTYPE html> <html lang"en"><head><meta charset…...

Hive SQL必刷练习题:留存率问题

首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总用户数 * 100% 解决思…...