手势控制演示文稿系统介绍
在传统的演示文稿控制方法中,如使用鼠标、键盘或遥控器,通常会限制演讲者的移动,并且可能会打断演讲的流畅性。本文将介绍如何构建一个使用计算机视觉和手势识别来控制演示文稿幻灯片的项目。主要目标是允许用户通过简单的手势来导航演示文稿幻灯片。通过检测特定的手势,系统可以解释动作,以向前或向后(或其他操作)通过幻灯片。演讲者可以自由移动,而不必担心点击器的电池耗尽或被键盘、鼠标或演示点击器束缚。
系统工作原理
系统使用摄像头捕获用户的手势。然后,这些视觉信息由使用Roboflow构建的计算机视觉模型处理。该模型识别特定的手势,并将它们转换为命令。根据检测到的手势,系统执行相应的命令来控制演示文稿幻灯片,例如移动到下一张或上一张幻灯片。
项目架构
要构建此系统,需要训练一个模型,该模型可以准确识别用于控制幻灯片的不同手势。在这个示例中,将训练一个模型来识别用于“下一张”和“上一张”命令的手势。
首先,收集不同手势的图像。在这里使用两种手势,如下所示,用于下一张和上一张命令。收集图像后,使用RoboflowAnnotate web界面为每个手势绘制边框并标记。需要为数据集中的两个类别“下一张”和“上一张”标记所有图像。
接下来,需要生成一个数据集。可以对数据集应用预处理和增强步骤以提高模型的准确性。在这个示例中,将使用默认的预处理和增强步骤。要生成数据集,请在侧边栏中点击“生成”。然后,滚动到页面底部并点击“创建”。这将生成数据集版本。之后,将被引导到一个页面,可以在该页面上训练模型。
点击“使用Roboflow训练”按钮开始训练模型。对于训练,选择Roboflow 3.0 -> Accurate -> Train from Public Checkpoint选项。提交训练作业后,它将被分配给服务器。将收到训练过程预计需要多长时间的估计。可以实时监控训练作业,图表显示模型训练时的性能。最后,将看到模型以高准确性训练完成。
模型训练完成后,重要的是在Roboflow web界面中测试其性能。为此,请点击Roboflow侧边栏中的“可视化”。可以上传自定义图像进行测试,或从测试集中选择图像。
在这一步中,将编写一个Python脚本,该脚本使用Roboflow推理服务器上训练的模型来检测视频流中的特定手势,并相应地控制幻灯片演示。要开始,请安装Roboflow Python包、推理SDK包和pyautogui包,将使用这些包在模型上运行推理:
pip install roboflow inference-sdk inference pyautogui
现在,在Python.py文件中复制并粘贴以下代码。在Python脚本中,更新RoboflowAPI密钥。
import cv2
import pyautogui
from inference_sdk import InferenceHTTPClient
import time
# Initialize InferenceHTTPClient
CLIENT = InferenceHTTPClient(
api_url="https://detect.roboflow.com",
api_key="ROBOFLOW_API_KEY"
)
video = cv2.VideoCapture(0)
while True:
ret, frame = video.read()
if not ret:
break
# Infer on the frame
result = CLIENT.infer(frame, model_id="hand-gestures-cjowr/2")
detections = result['predictions']
for bounding_box in detections:
x0 = int(bounding_box['x'] - bounding_box['width'] / 2)
x1 = int(bounding_box['x'] + bounding_box['width'] / 2)
y0 = int(bounding_box['y'] - bounding_box['height'] / 2)
y1 = int(bounding_box['y'] + bounding_box['height'] / 2)
class_name = bounding_box['class']
confidence = bounding_box['confidence']
# Draw bounding box and label on the frame
cv2.rectangle(frame, (x0, y0), (x1, y1), color=(0, 0, 255), thickness=1)
cv2.putText(frame, f"{class_name} - {confidence:.2f}", (x0, y0 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
(0, 0, 255), 1)
# Control slides based on detected class
if class_name == "low":
pyautogui.press('right')
time.sleep(1) # Pause for a seconds
elif class_name == "high":
pyautogui.press('left')
time.sleep(1) # Pause for a seconds
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video.release()
cv2.destroyAllWindows()
首先,代码不断从网络摄像头捕获帧。然后,代码将帧发送到推理服务器并接收检测结果。在检测到的对象上绘制边框和标签。然后,使用pyautogui根据检测到的手势控制幻灯片。
要执行,请首先在后台运行脚本。然后打开演示文稿并切换到幻灯片模式。现在,可以执行手势来移动到下一张和上一张幻灯片。
下图是执行代码时发生的情况的说明。在图像的左侧,看到后台正在执行代码,而在图像的右侧,看到幻灯片正在通过手势控制。
系统输出
在本文中,学习了如何构建一个基于手势的演示文稿幻灯片控制器,使用户可以使用特定的手势来导航幻灯片。使用自定义的计算机视觉模型,实时检测网络摄像头馈送中的手势,然后发送计算机信号来控制幻灯片。
当做出“下一张”手势时,它会移动到下一张幻灯片,当做出“上一张”手势时,它会回到上一张幻灯片。尽管只关注了两个手势,如移动到下一张或上一张幻灯片,但可以轻松添加更多手势,例如移动手来绘制或突出显示幻灯片上的内容。
类似的方法可以应用于幻灯片演示之外的各种应用,如游戏界面、虚拟现实交互或移动障碍用户的辅助工具。这个项目为探索手势识别和人机交互的交叉点提供了基础,促进了在不同领域中的创新解决方案。