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

用MediaPipe和Python做个隔空切水果游戏:从手势骨架提取到简单游戏逻辑实现

用MediaPipe和Python打造体感切水果游戏从手势识别到游戏逻辑全解析还记得小时候在街机厅玩《水果忍者》的畅快感吗现在我们完全可以用Python和MediaPipe技术在电脑前通过手势隔空切水果本文将带你从零开始实现一个完整的体感切水果游戏原型。无需昂贵的VR设备只需要普通摄像头和几十行Python代码就能让手势变成屏幕上的虚拟刀锋。1. 环境准备与MediaPipe基础首先确保你的开发环境已安装Python 3.7版本。我们将使用以下核心库pip install mediapipe opencv-python numpy pygameMediaPipe是Google开源的多媒体机器学习框架其手势识别解决方案能实时检测21个手部关键点如图1所示。这些关键点包括手腕、各手指关节和指尖的位置坐标为我们提供了丰富的手势数据。图1MediaPipe定义的21个手部关键点测试摄像头是否正常工作import cv2 import mediapipe as mp mp_hands mp.solutions.hands hands mp_hands.Hands(min_detection_confidence0.7, min_tracking_confidence0.5) cap cv2.VideoCapture(0) while cap.isOpened(): success, image cap.read() if not success: continue image cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB) results hands.process(image) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # 获取食指指尖坐标关键点8 index_tip hand_landmarks.landmark[8] print(f食指指尖坐标X{index_tip.x:.2f}, Y{index_tip.y:.2f}) cv2.imshow(Hand Tracking, cv2.cvtColor(image, cv2.COLOR_RGB2BGR)) if cv2.waitKey(5) 0xFF 27: break cap.release() hands.close()提示MediaPipe返回的坐标是归一化的0-1之间需要乘以画面宽高才能得到实际像素位置。2. 游戏核心机制设计我们的切水果游戏需要实现以下几个核心功能模块水果生成系统随机在屏幕顶部产生水果对象手势追踪系统将食指指尖映射为虚拟刀锋碰撞检测系统判断刀锋是否切中水果计分与反馈系统记录得分和视觉效果2.1 水果对象设计使用Pygame创建水果类包含位置、速度和状态属性import pygame import random class Fruit: def __init__(self, screen_width): self.radius random.randint(30, 50) self.x random.randint(self.radius, screen_width - self.radius) self.y -self.radius self.speed random.uniform(2, 5) self.color ( random.randint(100, 255), random.randint(100, 255), random.randint(100, 255) ) self.is_sliced False def update(self): self.y self.speed def draw(self, screen): pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.radius)2.2 手势映射与刀锋轨迹将食指指尖关键点8和中指指尖关键点12的中点作为刀锋位置def get_blade_position(hand_landmarks, image_width, image_height): index_tip hand_landmarks.landmark[8] # 食指指尖 middle_tip hand_landmarks.landmark[12] # 中指指尖 blade_x (index_tip.x middle_tip.x) / 2 * image_width blade_y (index_tip.y middle_tip.y) / 2 * image_height return int(blade_x), int(blade_y)为了检测挥砍动作我们需要计算刀锋的移动速度class BladeTracker: def __init__(self): self.prev_pos None self.speed 0 def update(self, current_pos): if self.prev_pos is not None: dx current_pos[0] - self.prev_pos[0] dy current_pos[1] - self.prev_pos[1] self.speed (dx**2 dy**2)**0.5 self.prev_pos current_pos注意实际应用中应该记录多个历史位置来计算更平滑的速度。3. 游戏主循环实现现在我们将所有组件整合到游戏主循环中import pygame import sys from collections import deque def main(): pygame.init() width, height 800, 600 screen pygame.display.set_mode((width, height)) clock pygame.time.Clock() # 初始化游戏元素 fruits [] blade_tracker BladeTracker() score 0 font pygame.font.Font(None, 36) # 初始化MediaPipe mp_hands mp.solutions.hands hands mp_hands.Hands(min_detection_confidence0.7, min_tracking_confidence0.5) cap cv2.VideoCapture(0) # 刀锋轨迹可视化 blade_path deque(maxlen10) while True: # 处理游戏事件 for event in pygame.event.get(): if event.type pygame.QUIT: pygame.quit() sys.exit() # 生成新水果按一定概率 if random.random() 0.02: fruits.append(Fruit(width)) # 获取手势数据 ret, frame cap.read() if not ret: continue frame cv2.cvtColor(cv2.flip(frame, 1), cv2.COLOR_BGR2RGB) results hands.process(frame) current_blade_pos None if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: current_blade_pos get_blade_position(hand_landmarks, width, height) blade_path.append(current_blade_pos) # 更新刀锋速度 if current_blade_pos: blade_tracker.update(current_blade_pos) # 更新水果状态 for fruit in fruits[:]: fruit.update() # 碰撞检测 if current_blade_pos and blade_tracker.speed 5: # 速度阈值 distance ((fruit.x - current_blade_pos[0])**2 (fruit.y - current_blade_pos[1])**2)**0.5 if distance fruit.radius: fruit.is_sliced True score 10 # 移除超出屏幕或已被切开的水果 if fruit.y height fruit.radius or fruit.is_sliced: fruits.remove(fruit) # 绘制游戏画面 screen.fill((0, 0, 0)) # 绘制水果 for fruit in fruits: fruit.draw(screen) # 绘制刀锋轨迹 if len(blade_path) 1: pygame.draw.lines(screen, (255, 255, 0), False, blade_path, 3) # 绘制分数 score_text font.render(f分数: {score}, True, (255, 255, 255)) screen.blit(score_text, (10, 10)) pygame.display.flip() clock.tick(60) if __name__ __main__: main()4. 高级优化与扩展基础版本完成后我们可以考虑以下优化方向4.1 性能优化技巧降低图像分辨率MediaPipe在小分辨率下也能良好工作cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)限制手部检测频率不需要每帧都检测if frame_count % 3 0: # 每3帧检测一次 results hands.process(frame)4.2 游戏性增强多种水果类型不同分值、不同特效class Fruit: TYPES [ {color: (255, 0, 0), score: 10}, # 普通水果 {color: (0, 255, 0), score: 20}, # 特殊水果 {color: (0, 0, 255), score: -10} # 炸弹 ] def __init__(self, screen_width): fruit_type random.choice(self.TYPES) self.color fruit_type[color] self.score_value fruit_type[score]连击系统快速连续切水果获得额外奖励4.3 视觉效果提升粒子效果水果被切开时的爆炸效果class Particle: def __init__(self, x, y, color): self.x x self.y y self.color color self.size random.randint(2, 5) self.vx random.uniform(-3, 3) self.vy random.uniform(-3, 3) self.lifetime 30 def update(self): self.x self.vx self.y self.vy self.lifetime - 1 def draw(self, screen): alpha int(255 * (self.lifetime / 30)) color (*self.color[:3], alpha) pygame.draw.circle(screen, color, (int(self.x), int(self.y)), self.size)刀光特效根据挥砍速度改变轨迹颜色5. 常见问题与调试技巧开发过程中可能会遇到以下典型问题手势检测不稳定确保手部在摄像头视野内且光照充足调整min_detection_confidence和min_tracking_confidence参数尝试使用手部边界框进行预处理碰撞检测不准确使用多个历史位置进行插值考虑刀锋的厚度而不仅是单点添加碰撞冷却时间防止重复检测性能瓶颈使用pygame.time.Clock().tick()控制帧率避免在游戏循环中创建新对象对MediaPipe使用静态图像模式(static_image_modeTrue)如果不需要实时跟踪调试时可以添加可视化辅助# 在游戏循环中添加调试信息 debug_text [ fFPS: {int(clock.get_fps())}, f水果数量: {len(fruits)}, f刀锋速度: {blade_tracker.speed:.1f}, f手部检测: {是 if current_blade_pos else 否} ] for i, text in enumerate(debug_text): debug_surface font.render(text, True, (255, 255, 255)) screen.blit(debug_surface, (width - 200, 10 i * 30))在项目开发过程中我发现在光线较暗的环境下手势识别准确率会明显下降。解决方案是添加一个简单的自适应亮度调整# 在获取摄像头帧后添加 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) brightness np.mean(gray) if brightness 50: # 太暗 frame cv2.convertScaleAbs(frame, alpha1.5, beta20)另一个实用技巧是使用双手控制——比如左手控制刀锋位置右手做出特定手势如握拳来触发特殊技能。这只需要扩展手势检测逻辑if len(results.multi_hand_landmarks) 2: # 判断哪只是左手/右手 # 检测特定手势如手指弯曲程度最终效果应该是一个流畅、响应灵敏的体感游戏帧率保持在30FPS以上手势延迟不超过100ms。在实际测试中我发现将游戏区域限制在摄像头视野的中心部分约60%区域能获得最佳体验因为边缘区域的手势识别准确率通常会降低。

相关文章:

用MediaPipe和Python做个隔空切水果游戏:从手势骨架提取到简单游戏逻辑实现

用MediaPipe和Python打造体感切水果游戏:从手势识别到游戏逻辑全解析 还记得小时候在街机厅玩《水果忍者》的畅快感吗?现在,我们完全可以用Python和MediaPipe技术,在电脑前通过手势隔空切水果!本文将带你从零开始&…...

STM32串口通信原理与实现详解

串口通信技术深度解析:从原理到STM32实现1. 串口通信基础概念1.1 数据传送方向分类串行通信根据数据传输方向可分为三种基本模式:单工模式:数据仅支持单向传输,如传统的广播系统。发送端和接收端角色固定,硬件上只需单…...

Android开机向导定制实战:从源码分析到禁用状态栏的隐藏技巧

Android开机向导深度定制:从源码解析到状态栏控制实战 第一次接触Android开机向导定制时,我被这个看似简单却隐藏复杂逻辑的系统组件深深吸引。作为设备初始化的第一道门户,开机向导不仅承载着用户体验的第一印象,更是厂商品牌展示…...

AceCommon:Arduino嵌入式零堆分配轻量C++工具库

1. AceCommon 库概述:面向嵌入式 Arduino 的轻量级底层工具集AceCommon 是一个专为资源受限的微控制器平台(尤其是 Arduino 生态)设计的零依赖、低开销 C 工具库。其核心设计哲学是“小而精、无侵入、可复用”。与常见的功能臃肿、依赖繁杂的…...

MX28智能舵机RS485底层驱动开发实战

1. MX28智能舵机底层驱动技术解析:基于RS485总线的嵌入式控制实现1.1 技术定位与工程价值MX28是Robotis公司推出的第二代高精度智能舵机(Smart Actuator),采用RS485半双工差分总线通信,支持位置、速度、扭矩闭环控制及…...

Anthropic 经济指数报告:学习曲线

引言 Anthropic 经济指数利用隐私保护数据分析系统,追踪 Claude 在整个经济领域中的应用情况。这是Anthropic 努力的一部分,旨在尽早理解 AI 对经济的影响,以便研究人员和政策制定者有充足的时间做好准备。 在最新一期的报告中,首先观察到了与先前报告相比使用情况的变化…...

Edge浏览器专属:B站直播实时字幕插件开发全记录(附源码下载)

Edge浏览器实现B站直播实时字幕的技术解析与实战 作为一名长期关注Web语音技术的开发者,我最近在Edge浏览器上成功实现了一个B站直播实时字幕插件。这个项目的核心价值在于解决了无字幕直播场景下的信息获取难题——根据用户反馈,超过68%的观众会在没有字…...

STM32L152RE 32MHz时钟配置库:超低功耗MCU高频稳定启动方案

1. 项目概述ST_L152_32MHZ是一个专为 STMicroelectronics Nucleo-L152RE 开发板设计的轻量级时钟配置库,其核心目标是将系统主频(SYSCLK)从出厂默认的 32 kHz LSE 或 16 MHz HSI 稳定提升至32 MHz,并确保所有关键外设时钟&#xf…...

抖音视频批量下载器:如何快速高效地收集和管理海量抖音内容

抖音视频批量下载器:如何快速高效地收集和管理海量抖音内容 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 抖音作为国内最大的短视频平台,每天产生数以百万计的视频内容,…...

无需编程!DouyinLiveWebFetcher让运营人员轻松实现抖音直播弹幕实时采集

无需编程!DouyinLiveWebFetcher让运营人员轻松实现抖音直播弹幕实时采集 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取(2024最新版本) 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 如…...

PCB布局设计规范与最佳实践指南

PCB布局设计的最佳实践指南1. 布局设计基础原则1.1 结构约束优先处理在PCB布局初期,必须优先考虑机械结构约束条件:根据导入的结构文件定位所有有特殊位置要求的器件连接器1脚位置必须与结构设计完全匹配严格遵守产品设计中规定的元件限高要求1.2 美观与…...

80+经典游戏的现代救赎:WidescreenFixesPack让老游戏焕发新生

80经典游戏的现代救赎:WidescreenFixesPack让老游戏焕发新生 【免费下载链接】WidescreenFixesPack Plugins to make or improve widescreen resolutions support in games, add more features and fix bugs. 项目地址: https://gitcode.com/gh_mirrors/wi/Widesc…...

大量文件夹能一键改名吗?怎么改?4个干货技巧教你快速搞定

每次整理电脑文件时,面对成百上千个命名混乱的文件夹,手动逐个修改不仅耗时费力,还容易出现重复或格式错误。本文汇总了4种实用的批量重命名方法,从简单的系统自带功能到专业软件、插件工具,再到进阶的批处理脚本&…...

告别编译踩坑:详解GMP交叉编译中DESTDIR和.la文件的那些‘坑’与正确用法

告别编译踩坑:详解GMP交叉编译中DESTDIR和.la文件的那些‘坑’与正确用法 交叉编译是嵌入式开发和跨平台构建中的常见需求,但其中隐藏的陷阱往往让开发者头疼不已。特别是像GMP这样的基础数学库,一旦编译或部署环节出现问题,可能导…...

计算机毕业设计:汽车数据可视化与后台管理平台 Django框架 requests爬虫 可视化 车辆 数据分析 大数据 机器学习(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

提升嵌入式代码注释质量的工具与技术方案

提升代码注释质量的实用工具与技术方案1. 代码注释工具概述1.1 代码注释的重要性在嵌入式系统开发中,良好的代码注释是保证项目可维护性的关键因素。专业的注释工具能够帮助开发者:创建可视化注释,提升代码可读性生成标准化的文档结构维护代码…...

3大核心功能:让iOS推送调试效率提升10倍的SmartPush工具全解析

3大核心功能:让iOS推送调试效率提升10倍的SmartPush工具全解析 【免费下载链接】SmartPush SmartPush,一款iOS苹果远程推送测试程序,Mac OS下的APNS工具APP,iOS Push Notification Debug App 项目地址: https://gitcode.com/gh_mirrors/smar/SmartPush 一、问…...

【收藏干货】IndexRAG:离线生成桥接事实,实现单次检索的多跳推理

plaintext IndexRAG: Bridging Facts for Cross-Document Reasoning at Index Timehttps://arxiv.org/pdf/2603.16415 ### 一、多跳QA的困境多跳问答(Multi-hop QA)要求模型跨越多篇文档进行推理,比如回答"电影Aylwin的导演出生在哪里&q…...

GIS开发必备:5分钟搞定EPSG3857转WGS84坐标转换(附proj4.js完整代码)

GIS开发实战:从原理到代码实现EPSG3857与WGS84的高效坐标转换 刚接触WebGIS开发的工程师们,常常会被各种坐标系搞得晕头转向。为什么高德地图上显示的位置和GPS设备采集的数据对不上?为什么Leaflet、OpenLayers这些库加载的瓦片地图坐标数值大…...

SQLite.Interop.DLL加载失败的3种修复方案 - 从运行库到项目配置全搞定

SQLite.Interop.DLL加载失败的终极解决方案:从运行环境到项目配置深度解析 当你正在开发一个依赖SQLite数据库的C#项目时,突然遇到"无法加载DLLSQLite.Interop.DLL"的错误提示,这绝对是一个令人头疼的问题。作为一名有多年.NET开发…...

WebPlotDigitizer图表数据提取工具:科研工作者的终极数字化解决方案

WebPlotDigitizer图表数据提取工具:科研工作者的终极数字化解决方案 【免费下载链接】WebPlotDigitizer WebPlotDigitizer: 一个基于 Web 的工具,用于从图形图像中提取数值数据,支持 XY、极地、三角图和地图。 项目地址: https://gitcode.c…...

【AI+教育】告别“硬啃”长文,它把文档直接变成你的专属视频课

在这个信息大爆炸的时代,我们最不缺的就是资料:网盘里屯满的行业报告、收藏了却从未打开的学术论文、买来盖泡面的大部头教材……知识就在那里,但“学进去”实在太难了。 秘塔推出的“今天学点啥”,就是为了解决这个痛点而生的。它的核心逻辑非常简单粗暴:你把看不进去的文…...

从零开始:如何用Python训练一个AI模型(超详细教程)

引言 人工智能(AI)——一个熟悉又神秘的词汇。我们常听说它可以生成诗歌、编写代码、创作艺术,甚至回答各种问题。然而,当你想亲手实现一个“AI 模型”时,却可能感到无从下手。这篇教程正是为你准备的,将带…...

【AI+教育】AI总犯“金鱼记忆”?揭秘大模型长期记忆架构,让它真正记住你!

在和AI对话时,你是否有过这样的抓狂时刻:前脚刚告诉它“我叫小明,我不吃香蕉”,五分钟后它又热情地向你推荐香蕉饼? 目前的多数大语言模型就像拥有“金鱼记忆”,一刷新就忘得一干二净。为了让智能体(Agent)能像真正的老朋友一样懂你,我们设计了一套长期记忆功能模块。…...

咱就说中小厂房、仓库的火灾报警系统,用S7-200 PLC加组态王真的是性价比天花板——够稳定、好上手,成本还低,完全满足日常需求

基于S7-200 PLC和组态王火灾报警控制系统 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面咱先从最基础的IO分配说起,直接给大家上我常用的分配表(都是经过3个项目验证的,靠谱…...

QuickRecorder高效解决方案:从基础到进阶的macOS录屏全指南

QuickRecorder高效解决方案:从基础到进阶的macOS录屏全指南 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHu…...

PyQt新手必看:Fluent Widgets vs PyQtGraph,哪个更适合你的GUI项目?

PyQt新手指南:Fluent Widgets与PyQtGraph的深度对比与选型策略 当你第一次踏入PyQt GUI开发的世界,面对琳琅满目的框架选择,是否感到迷茫?Fluent Widgets和PyQtGraph这两个名字可能已经出现在你的搜索列表中,但它们究竟…...

s2-pro快速上手指南:3步完成文本转语音与音色迁移实操手册

s2-pro快速上手指南:3步完成文本转语音与音色迁移实操手册 1. 平台简介 s2-pro是Fish Audio开源的专业级语音合成模型镜像,它能够将文本内容转换为自然流畅的语音,并支持通过参考音频实现音色迁移功能。这意味着你可以上传一段参考音频&…...

从零开始:如何用开源方案打造你的第一台六足机器人

从零开始:如何用开源方案打造你的第一台六足机器人 【免费下载链接】hexapod 项目地址: https://gitcode.com/gh_mirrors/hexapod5/hexapod 想要亲手制作一台能够自如行走的六足机器人吗?hexapod开源项目为你提供了一套完整的免费解决方案&#…...

MATLAB驱动的焊接机器人智能轨迹优化与动态仿真实践

1. 焊接机器人轨迹优化的技术挑战 焊接机器人在现代制造业中扮演着越来越重要的角色,但要让机器人焊得又快又好,可不是件简单的事。想象一下,你要用焊枪在复杂的三维曲面上画出一条完美的焊缝,既要保证焊接质量,又要避…...