用手势掌控PPT,玩转演示新姿势

news2024/11/29 12:49:47

推荐运行环境

 使用anaconda创建环境,以免污染原来的python开发环境
 conda install python=3.9
 pip install -q mediapipe==0.10.0
 pip install pyautogui
 Python: version 3.8 - 3.11
 PIP: version 20.3+
 

请注意以下的坑

以下为我测试过程中的大坑,请及时避开!!!

出现如下错误:

RuntimeError: File loading is not yet supported on Windows

mediapipe0.9 版本太低

出现如下错误:

RuntimeError: Unable to open file at gesture_recognizer.task

base_options = python.BaseOptions(model_asset_path='gesture_recognizer.task')

gesture_recognizer.task 所在路径不能包含中文名称

项目概述:

通过手势识别实现了控制 PowerPoint 播放幻灯片的功能。在识别到特定手势("Open_Palm")时,会模拟按下 "Page Down" 键,从而使幻灯片向下翻页。同时,通过 PyAutoGui(用python 实现朋友圈自动点赞_python朋友圈自动点赞-CSDN博客) 控制鼠标和键盘进行交互操作。整个流程包括捕获视频帧、进行手势识别、根据识别结果执行相应操作等步骤。

原项目帮助文档:

 https://developers.google.com/mediapipe/solutions/vision/gesture_recognizer
  • Mediapipe 库介绍

Mediapipe 是由 Google 开发的一个开源库,旨在简化构建实时视觉和机器学习应用程序的过程。这个库提供了一系列预训练模型、工具和流水线,能够帮助开发者快速地开发各种涉及计算机视觉、姿态估计、手部追踪、物体检测、语义分割等任务的应用。

以下是 Mediapipe 库的一些特点和功能:

  1. 实时性:Mediapipe 库专注于实时应用程序的开发,能够在较短的时间内处理视频流或摄像头输入,并输出相应的结果。这使得它适用于实时交互应用、增强现实(AR)、虚拟现实(VR)等领域。

  2. 预训练模型:Mediapipe 提供了多个预训练模型,包括人体姿态估计、手部关键点检测、面部检测、物体识别等,为开发者提供了便捷的解决方案,无需从头开始训练模型。

  3. 模块化设计:Mediapipe 的设计是模块化的,允许开发者根据需求自由组合各种组件,构建出符合自己应用需求的流水线。

  4. 跨平台:Mediapipe 支持在不同平台上运行,包括桌面端、移动设备、嵌入式设备等,使得开发者可以轻松地将其应用部署到不同的环境中。

  5. 易于使用:Mediapipe 提供了丰富的文档、示例代码和教程,帮助用户快速上手并构建自己的视觉应用程序。同时,它还支持多种编程语言,包括 Python、C++ 等。

        通过 Mediapipe 库,开发者可以快速实现复杂的计算机视觉任务,加速应用程序的开发过程,同时享受到高效、稳定的模型性能和准确度。这使得 Mediapipe 成为一个强大的工具,为开发者在视觉和机器学习领域提供了丰富的功能和资源。

这个模型能识别七种手势:

 0 - Unrecognized gesture, label: Unknown
 1 - Closed fist, label: Closed_Fist ✊
 2 - Open palm, label: Open_Palm 👋
 3 - Pointing up, label: Pointing_Up ☝️
 4 - Thumbs down, label: Thumb_Down 👎
 5 - Thumbs up, label: Thumb_Up 👍
 6 - Victory, label: Victory ✌️
 7 - Love, label: ILoveYou 🤟
 ​

在线演示地址:

http:// https://mediapipe-studio.webapps.google.com/studio/demo/gesture_recognizer

  • Hand landmark模型

        Hand landmark 模型是 Mediapipe 库中的一种模型,专门用于手部姿势估计和手势识别。该模型可以检测手部关键点,包括手指、手掌、手腕等部位,并提供准确的手部姿势信息。通过 Hand landmark 模型,开发者可以实现精细的手部动作追踪、手势识别、手语翻译等应用。

以下是 Hand landmark 模型的一些特点和功能:

  1. 关键点检测:Hand landmark 模型能够检测手部关键点,包括21个关键点,涵盖手掌、手指和手腕等部位。这些关键点对于描述手部姿势和手势非常重要。

  2. 精准度:Hand landmark 模型在识别手部关键点方面具有很高的精准度,可以准确地捕捉手部各部位的位置和姿势。

  3. 实时性:Hand landmark 模型可以在实时视频流中运行,实现实时的手部姿势估计和跟踪,适用于实时交互应用。

  4. 多手支持:该模型支持检测多只手,可以同时处理多只手部的姿势并提取出相应的关键点信息。

  5. 模型优化:Hand landmark 模型经过优化,能够在移动设备上高效运行,提供良好的性能和准确度。

        通过使用 Hand landmark 模型,可以构建各种基于手部姿势的应用程序,如手势控制、手部动作追踪游戏、手势识别交互界面等。这个模型为开发者提供了一个强大的工具,帮助他们在视觉和交互领域创造更加丰富、生动的体验。

  • 手势辨识模型gesture_recognizer.task下载地址

https://storage.googleapis.com/mediapipe-models/gesture_recognizer/gesture_recognizer/float16/1/gesture_recognizer.task

PowerPoint 常用快捷鍵

【Page Up】或【↑】或【←】 上一张

【Page Down】或【↓】或【→】 下一张

【F5】 开始播放幻灯片

【Home】 回到幻灯片第一页

【Esc】 结束放映

以下为完整程序,给出了详尽的注释

 """
 gesture_control_ppt.py
 """
 ​
 import mediapipe as mp
 from mediapipe.tasks import python
 from mediapipe.tasks.python import vision
 from mediapipe.framework.formats import landmark_pb2
 import cv2
 import numpy
 import pyautogui as ag
 ​
 mp_hands = mp.solutions.hands  # 检测手势
 mp_drawing = mp.solutions.drawing_utils  # 在图像上绘制检测到的结果,如手势、特征点等
 mp_drawing_styles = mp.solutions.drawing_styles  # 定义绘制样式的模块
 ​
 ​
 def display_gesture_and_hand_landmarks(images, gestures, hand_landmarks):
     # 将图像 images 转换为 NumPy 数组
     image = images.numpy_view()
 ​
     # 提取最顶层手势信息和手部特征点列表
     # “最顶层”可能表示检测到的主要手势或优先级最高的手势。通过选择第一个手势或者根据算法返回的置信度来确定最顶层手势。
     top_gestures = [gestures for gestures in gestures]
     hand_landmarks_list = [hand_landmarks for hand_landmarks in hand_landmarks]  # 存储了手部特征点的坐标数据
 ​
     title = ''  # 初始化标题字符串
     gesture_name = ''  # 初始化手势名称字符串
 ​
     '''
     当检测到手势信息时,从第一个手势中提取手势的名称和置信度得分,
     然后构建一个带有手势名称和置信度的标题字符串,
     以便将这些信息显示在图像上。这样做可以帮助用户了解检测到的主要手势类型及其对应的置信度评分。
     '''
     if numpy.size(top_gestures) != 0:
         gesture_name = top_gestures[0][0].category_name
         gesture_score = top_gestures[0][0].score
         title = f"{gesture_name}({gesture_score:.2f})"
 ​
     # 创建图像的副本以进行标注
     annotated_image = image.copy()
 ​
     # 如果检测到手部特征点列表,则对每个手部特征点列表进行处理
     if numpy.size(hand_landmarks_list) != 0:
         for hand_landmarks in hand_landmarks_list:
             hand_landmarks_proto = landmark_pb2.NormalizedLandmarkList()
             hand_landmarks_proto.landmark.extend([
                 landmark_pb2.NormalizedLandmark(x=landmark.x, y=landmark.y, z=landmark.z) for landmark in hand_landmarks
             ])  # 通过使用列表推导式,将每个手部特征点的 x、y、z 坐标数据添加到 hand_landmarks_proto 中。
 ​
             # 在图像上绘制手部特征点和连接线
             mp_drawing.draw_landmarks(
                 annotated_image,  # 表示要在其上绘制手部特征点和连接线的图像对象
                 hand_landmarks_proto,  # 包含手部特征点坐标数据的对象
                 mp_hands.HAND_CONNECTIONS,  # 指定手部特征点之间的连接关系,以便绘制连接线
                 mp_drawing_styles.get_default_hand_landmarks_style(),  # 表示用于绘制手部特征点的样式,包括颜色、线宽等信息
                 mp_drawing_styles.get_default_hand_connections_style())  # 表示用于绘制手部连接线的样式,同样包括颜色、线宽等信息
 ​
     # 在图像上添加标题文本
     cv2.putText(annotated_image, f"{title}",
                 (20, 30), cv2.FONT_HERSHEY_DUPLEX,
                 1, (0, 0, 255), 1, cv2.LINE_AA)
 ​
     # 返回带有标注信息和手势名称的图像及手势名称
     return annotated_image, gesture_name
 ​
 ​
 # 移动鼠标指针,点击并按 F5 键
 ag.moveTo(852, 125, 1) #   幻灯片坐标的确定可以使用截图软件Snipaste, 这是我笔记本上的坐标
 ag.click()
 ag.press('f5')
 ​
 # 创建一个 GestureRecognizer 对象
 # 帮助文档 https://developers.google.com/mediapipe/api/solutions/python/mp/tasks/vision
 base_options = python.BaseOptions(model_asset_path='gesture_recognizer.task')  # 该文件路径不能包含中文名
 options = vision.GestureRecognizerOptions(base_options=base_options)
 recognizer = vision.GestureRecognizer.create_from_options(
     options)
 ​
 cap = cv2.VideoCapture(0)
 ​
 # 以下实时处理来自摄像头的视频流并进行手势识别
 while True:  # 无限循环,持续从摄像头读取帧,并进行手势识别和处理
     ret, frame = cap.read()  # 从摄像头(或视频文件)中读取一帧图像数据
     mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)  # 将读取的图像帧转换为 Mediapipe 图像对象
     recognition_result = recognizer.recognize(mp_image)  # 使用手势识别器(recognizer)对图像进行手势识别,返回手势识别的结果
     top_gesture = recognition_result.gestures  # 提取手势识别结果中的顶层手势信息
     hand_landmarks = recognition_result.hand_landmarks  # 提取手势识别结果中的手部特征点信息
     annotated_image, gesture_name = display_gesture_and_hand_landmarks(mp_image, top_gesture,
                                                                        hand_landmarks)  # 调用显示函数,生成带有标注的图像并获取手势名称
     cv2.imshow('frame', annotated_image)  # 在窗口中显示带有手势标注的图像
 ​
     # 可以将手势换成 "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory"
     if gesture_name == "Open_Palm":
         ag.press('pagedown')
         ag.PAUSE = 1
     # 按Esc键退出循环
     if cv2.waitKey(1) == 27:
         break
 ​
 cap.release()
 cv2.destroyAllWindows()
 

程序运行

1、如果单屏(多屏,两个应用程序可以在不同屏上演示更好),先打开幻灯片,我是用PowerPoint打开的。如果你用其它软件打开,请自己确定打开的坐标,修改ag.moveTo(852, 125, 1) 中坐标的值。

2、运行gesture_control_ppt.py,最小化pycharm窗口,PPT程序在最上面

3、当摄像头亮起时,用Open_Palm👋手势控制。

4、切换到视频窗口点击,按ESC退出程序。

幻灯片坐标的确定可以使用截图软件Snipaste来确定。

演示,因为只能上传gif,只是意思一下

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

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

相关文章

【嵌入式开发实验】外部中断 按键 LED灯;定时中断;检测直流电机的转速 液晶屏显示;(附实验代码+注释+实验简析)| 附:步进电机/循迹小车相关

“永远不要停止思考,永远不认输。” 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🏅[4] 阿里云社区特邀专家博主🏅 �

4. Python的深拷贝、浅拷贝

文章目录 0、先说结论1、浅拷贝修改元素值2、深拷贝修改元素值学习链接 0、先说结论 无论深拷贝还是浅拷贝都会为新对象分配一块新的内存,因此新老对象id不相同。 对于浅拷贝,新老对象内部的可变and不可变元素id都是相同的(在没修改元素值之前)。 对于深…

【限时免费,手慢无】Unity 怪物资源包,MONSTER 动作超丰富,不领后悔!

Unity 怪物资源包,MONSTER 动作超丰富 前言资源包内容领取兑换码 前言 👾 突破想象!惊艳众人的怪物模型登场 👾 今天要向大家介绍一款令人瞩目的游戏怪物模型!这个看似丑陋的小怪物,却有着巨大的潜力&…

JavaWeb之过滤器(Filter)与监听器(Listener)

前言 过滤器(Filter) 1.什么是过滤器 2.过滤器的语法格式 3.使用场景 3.1.如何防止用户未登录就执行后续操作 3.2.设置编码方式--统一设置编码 3.3.加密解密(密码的加密和解密) 3.4.非法文字筛选 3.5.下载资源的限制 监听器(Listener) 1.什么是监听器 2.监听器分类…

目标检测——色素性皮肤病变数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

如何理解VMware中的网络模式(NAT、桥接、仅主机)

目录 Ⅰ.NAT模式 Ⅱ.仅主机模式 Ⅲ.桥接模式 Ⅰ.NAT模式 NAT模式:将物理机的网卡作为虚拟交换机的上线链路,将vmware的私有网络转成可以上网的地址进行网络访问,因此在NAT模式下虚拟机是可以访问外部网络的(图一) …

电路板维修【一】

最近喜欢上了电路板维修,经常看很多博主的维修视频,觉得还是颇有收获的(维修板子原来有方法可循),于是做笔记如下: 一.【修了半天也没找到问题,原来是检查方向错了,变频油烟机板维修…

基于SSM的“医院院内物资管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“医院院内物资管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 功能模块图 系统登录页面 用户管理功能模块 模板列表管…

CSS---复合选择器、元素显示模式和背景(三)

一、CSS的复合选择器 1.1 什么是复合选择器 在CSS中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基本选择器进行组合形成的。 复合选择器是由两个或多个基础选择器连写组成,它…

监控异地组网怎么组网?

监控异地组网是指在不同地域的网络环境下,实现对监控设备的远程访问和管理。在传统的网络环境下,由于网络限制和设备配置等问题,监控设备的远程访问往往受到一定的限制和困扰。为了解决这个问题,引入了天联组网技术,实…

LLM大语言模型(十五):LangChain的Agent中使用自定义的ChatGLM,且底层调用的是remote的ChatGLM3-6B的HTTP服务

背景 本文搭建了一个完整的LangChain的Agent,调用本地启动的ChatGLM3-6B的HTTP server。 为后续的RAG做好了准备。 增加服务端role:observation ChatGLM3的官方demo:openai_api_demo目录 api_server.py文件 class ChatMessage(BaseModel…

英语学习笔记9——How are you today?

How are you today? 你好吗? 词汇 Vocabulary well adj. 好的 n. 井 fine adj. 美好的 两个方面:天气、身体。 搭配:a fine day 晴朗的一天    It’s a fine day today. 今天很晴朗。 good adj. 好的 口语偏多 搭配:Good jo…

【Python技术】使用akshare、pandas高效复盘每日涨停板行业分析

作为一个程序员宝爸,每天的时间很宝贵,工作之余除了辅导孩子作业,就是补充睡眠。 怎么快速高效的进行当天A股涨停板的复盘,便于第二天的跟踪。这里简单写个示例, 获取当天连涨数排序,以及所属行业排序。 …

服务器数据恢复—RAID5磁盘阵列两块盘离线的数据恢复过程

服务器故障: 服务器中有一组由多块硬盘组建的raid5磁盘阵列,服务器阵列中2块硬盘先后掉线导致服务器崩溃。 服务器数据恢复过程: 1、将故障服务器中所有磁盘编号后取出,由硬件工程师对掉线的两块磁盘进行物理故障检测&#xff0c…

AGI 时代,Rust与Python谁是未来的语言?

随着 Rust 在开发者社区中越来越受欢迎,有必要问一下,Rust 会取代 Python 吗?哪一款最适合您?而且,你应该开始学习 Rust 吗?本文将对 Rust 与 Python 进行全面比较。读完本文后,你将对是否要开始…

uniapp:抖音PK进度条(nvue)

nvue中,仿抖音PK进度条效果, <template><view class="index" :style="{width:windowWidth+px,height:index_windowHeight+px,paddingTop:windowTop+px}"><view class="pk"><text class="pk_jindu_left_val fsz-24 …

基于SSM框架弹幕视频网站

采用技术 基于SSM框架弹幕视频网站的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 前台首页 首页 登录 视频信息 商品信息 个人信息 用户模块 我…

ntfs文件系统的优势 NTFS文件系统的特性有哪些 ntfs和fat32有什么区别 苹果电脑怎么管理硬盘

对于数码科技宅在新购得磁盘之后&#xff0c;出于某种原因会在新的磁盘安装操作系统。在安装操作系统时&#xff0c;首先要对磁盘进行分区和格式化&#xff0c;而在此过程中&#xff0c;操作者们需要选择文件系统。文件系统也决定了之后操作的流程程度&#xff0c;一般文件系统…

图像处理的一些操作(3)

图像处理 13.创建主窗口与子图13.1导入模块 加载图片13.2创建窗口13.3创建子图数组 14.定义png图像文件路径15.提取指定帧图像16.图像旋转17.伽马值校正18.检查图像对比度19.强度缩放20 . 绘制直方图20.三通道彩色直方图21.算子21.1Sobel22.2 prewitt 22.滤波器23.绘制图形23.1…

python实现背单词程序

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.分析 一.前言 背单词是学习英语的一个重要环节,它有很多好处,以下是其中一些主要的好处: 提高词汇量