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

推荐运行环境

 使用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,只是意思一下

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

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

相关文章

【2024高校网络安全管理运维赛】巨细记录!

2024高校网络安全管理运维赛 文章目录 2024高校网络安全管理运维赛MISC签到考点:动态图片分帧提取 easyshell考点:流量分析 冰蝎3.0 Webphpsql考点:sql万能钥匙 fileit考点:xml注入 外带 Cryptosecretbit考点:代码阅读…

Driftingblues靶机系列Driftingblues5

获取靶机的ip:192.168.108.37 扫描靶机的端口服务: 看到web服务和ssh服务: 先查看一下web服务: 扫描到web服务的信息: 访问web服务: 在源代码中并没有看到有什么新的信息,扫描一下靶机目录:…

vue地址选择器-三级联选择器+详细地址

在页面的显示情况 前端拼接实现存储 具体实现步骤 1.安装中国全省市区的数据 在命令提示符窗口使用管理员身份进入对应vue项目的文件夹,在窗口安装 npm install element-china-area-data -S2.在script内引入安装的数据 import {regionData,codeToText } from…

从Flutter范儿的单例来看Dart的构造函数

点击上方蓝字关注我,知识会给你力量 单例模式 单例模式应该是设计模式中使用的最广泛的一种设计模式了,在Kotlin中,甚至为它单独创建了一个语法糖——object类,来快速实现单例模式,而在Dart中,并没有像Kotl…

某盾BLACKBOX逆向关键点

需要准备的东西: 1、原JS码 2、AST解混淆码 3、token(来源于JSON) 一、原JS码很好获取,每次页面刷新,混淆的代码都会变,这是正常,以下为部分代码 while (Qooo0) {switch (Qooo0) {case 110 14 - 55: {function O0…

Win10/11共享文件夹,访问提示需要输入用户名密码

Win10/11共享文件夹,访问提示需要输入用户名密码 问题 已经关闭了密码保护共享,但是局域网其他电脑访问该文件夹,提示需要输入用户名和密码 解决方法 操作步骤 1.按WINR键打开运行,输入gpedit.msc打开本地组策略编辑器 2.按如…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 (1)白鲸优化算法BWO 参考文献:Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. (2)龙格-库塔优化…

【Android学习】简单的登录页面和业务逻辑实现

实现功能 1 登录页&#xff1a;密码登录和验证码登录 2 忘记密码页&#xff1a;修改密码 3 页面基础逻辑 java代码 基础页面 XML login_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.and…

Agent AI:智能代理的未来

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦梦梦梦 &#x1f64b;‍♂️ 小伙伴们如果在学习过程中有不明白的地方&#xff0c;欢迎评论区留言提问&#xff0c;小梦定知无不言&#xff0c;言无不尽。 目录 一、Agent AI的起源与发展 二、Agent A…

js,JavaScript 对象(2024-05-02)

对象是 JavaScript 的数据类型之一。 对象用于存储键/值&#xff08;名称/值&#xff09;集合。 JavaScript 对象是命名值的集合。 下例创建具有四个键/值属性的 JavaScript 对象&#xff1a; const person {firstName: "Bill",lastName: "Gates",age:…

Linux中的简单操作 ls/tar/pwd/cd/mkdir/touch 等

目录 前言 安装和卸载软件包 ls 查看指定路径下的文件和文件夹 tar 解压缩/压缩命令 pwd 查看当前路径 cd 改变目录 mkdir 创建目录 递归创建 rm rmdir 删除文件或目录 touch 创建文件 ll、echo、重定向符&#xff08;>,>>&#xff09; ll echo 重定向符…

嵌入式C语言高级教程:实现基于STM32的无线远程监控系统

无线远程监控系统可以广泛应用于安防、环境监测等领域&#xff0c;提供实时数据传输和警报功能。本教程将指导您如何在STM32微控制器上实现一个基本的无线远程监控系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32L476RG&#xff0c;特别适合低功耗应用。开发板…

MySQL数据库实验三

本文承接前面的俩次实验基础上完成&#xff0c;不过实现的都是基础操作的练习 目录 目录 前言 实验目的 实验要求 实验内容及步骤 updata操作 delete操作 alter操作 添加列 删除列 修改列的数据类型 要求实现 实验结果 代码结果 注意事项 思考题 总结 前言 本文是MySQL数据库…

c++11 lambda 捕获,匿名,返回类型后置

lambda就是即写即用的匿名函数&#xff0c;可以用于解决匹配函数参数的问题 int main(int argc,char *argv[]) {vector<int> v{1,2,3,4,5,6,7,8};for_each(v.begin(),v.end(),[](int a){cout<<a;});return 0; } for_each是固定函数&#xff0c;我们需要他但是又没…

MySQL中JOIN连接的实现算法

目录 嵌套循环算法&#xff08;NLJ&#xff09; 简单嵌套循环&#xff08;SNLJ&#xff09; 索引嵌套循环&#xff08;INLJ&#xff09; 块嵌套循环&#xff08;BNLJ&#xff09; 三种算法比较 哈希连接算法&#xff08;Hash Join&#xff09; 注意事项&#xff1a; 工…

分享5个免费AI一键生成毕业论文的网站

一、引言 对于忙碌的学生来说&#xff0c;毕业论文通常是一项艰巨的任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;现在有一些工具可以帮助学生轻松完成论文。本文将介绍五个免费的AI工具&#xff0c;它们能够一键帮助你生成毕业论文&#xff0c;让你的学术生…

Linux流程控制

if语句 基本格式 if condition thencommand1 fi 写成一行 if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi if-else语句 格式 if condition thencommand1 command2...commandN elsecommand fi if else- if else if condition1 th…

wordpress忘记后台密码,在数据库中修改回来,然后再修改回去。

源地址&#xff1a;https://www.ctvol.com/seoomethods/1421332.html 我们在做wordpess运维的时候&#xff0c;都会遇到很尴尬的时候&#xff0c;有时候在错误运维中&#xff0c;不知道删除了什么东西&#xff0c;造成wordpress后台不能登录&#xff0c;后台页面也直接失效&am…

Google Chrome浏览器便携增强版 v124.0.6367.61

01 软件介绍 Google Chrome v124.0.6367.61&#xff0c;这一版本经过精心设计&#xff0c;集成了一系列的功能增强和关键补丁&#xff0c;旨在提升用户体验。其中&#xff0c;Chrome引入了便携性数据保存选项&#xff0c;优化了标签页及标签栏的操作机制。此外&#xff0c;它还…

互联网黑话知所多少?

互联网黑话是互联网公司形成的一套带有浓厚互联网行业特色的“非正式语言”。这些黑话通常起源于社交媒体、网络论坛、技术博客以及职场交流中&#xff0c;它们可能是缩写词、行业术语、梗或者其它专业领域的词汇。来盘一盘你常听、常用的互联网黑话都有哪些吧&#xff01;