一、项目要求
1、题目
本题着力于解决会商演示系统中的非接触式人机交互问题,具体而言,其核心问题就是通过计算机视觉技术实现对基于视频流的手势动作进行实时检测和识别。通过摄像头采集并识别控制者连续的手势动作,完成包括点击、平移、缩放、抓取、旋转等5种基本交互功能,除此之外还可针对不同客户的具体业务需求,可在这五种基本手势动作的基础上进行扩展。
选手可利用传统计算机视觉方法或基于机器学习/深度学习的方法,通过对基于摄像头采集的连续视频输入中用户的手势动作进行检测和识别,输出相应的控制信号,从而完成会商演示系统的交互。结合业务需求,进行算法模型的开发,实现真实环境下对用户控制手势的识别,达到实时交互的目的。
2、技术要求与指标
能够实现对摄像头拍摄的视频流中控制手势进行检测和识别,并以此实时控制演示系统。指标要求:
(1)每一种手势动作的检测识别准确率达到80%以上
(2)每一个手势动作的检测和识别时间(即从执行完手势动作到输出结果之间的时间)不超过500ms
一般开发环境以及开发语言不限(可使用Python+OpencCV,深度 学习框架可使用PyTorch、TensorFlow 等)。开发过程允许使用开源代码,但需要在文档中详细注明,且其许可证需保证商业可用,不能采用商用模块。
二、运行环境
本系统能够运行在基于PC操作系统Windows环境下,要求Windows操作系统安装Python 3.9 及以上环境, 要求安装相关库OpenCV、Mediapipe、PyQt5、Qtawesome。
安装OpenCV —— python3.9安装OpenCV
安装Mediapipe —— Python安装Mediapipe
安装PyQt5 —— PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)
安装Qtawesome —— Python安装Qtawesome
三、效果
1、基本动作
包括点击、抓取、平移、缩放、旋转5个基本动作
2、扩展动作
包括数字一、二、三、四、五、六、我爱你
四、代码
1、项目结构
2、项目代码
(1)布局代码
# -*- coding: utf-8 -*-
import sys
import qtawesome
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
class WindowLayout(object):
def __init__(self):
# 容器
self.central_widget = None
# 组件
self.close_button = None
self.other_button = None
self.minimize_button = None
self.start_button = None
self.camera_button = None
self.camera_label = None
self.result_label = None
self.running_label = None
def setupUi(self, MainWindow):
# 平台
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1250, 730)
# ------------- 代码布局 ------------- #
self.central_widget = QtWidgets.QWidget(MainWindow)
self.central_widget.setObjectName("central_widget")
MainWindow.setCentralWidget(self.central_widget) # 把容器放到平台上面
# 关闭按钮
self.close_button = QtWidgets.QPushButton(self.central_widget)
self.close_button.setGeometry(QtCore.QRect(60, 60, 30, 30))
self.close_button.setObjectName("close_button")
# 空白按钮
self.other_button = QtWidgets.QPushButton(self.central_widget)
self.other_button.setGeometry(QtCore.QRect(120, 60, 30, 30))
self.other_button.setObjectName("other_button")
# 最小化按钮
self.minimize_button = QtWidgets.QPushButton(self.central_widget)
self.minimize_button.setGeometry(QtCore.QRect(180, 60, 30, 30))
self.minimize_button.setObjectName("minimize_button")
# 打开摄像头 按钮
self.camera_button = QtWidgets.QPushButton(self.central_widget)
self.camera_button.setIcon(qtawesome.icon('fa5s.video', color='white'))
self.camera_button.setText(" 打开相机")
self.camera_button.setGeometry(QtCore.QRect(60, 130, 150, 40))
self.camera_button.setObjectName("camera_button")
# 手势检测 按钮
self.start_button = QtWidgets.QPushButton(self.central_widget)
self.start_button.setIcon(qtawesome.icon('fa5s.eye', color='white'))
self.start_button.setText(" 手势检测")
self.start_button.setGeometry(QtCore.QRect(60, 190, 150, 40))
self.start_butto