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

基于mediapipe深度学习算法的手势数字0-9识别系统python源码+精美GUI界面

【算法原理】

判断弯曲状态的方法

为了判断每根手指是伸直还是弯曲,采用了基于关键点相对位置的角度分析方法。以大拇指为例,系统首先识别出大拇指上的四个关键点(假设这些点按手指的自然顺序标记为点1至点4)。接着,利用这些关键点的坐标,计算两组相邻关键点之间的角度:一组是点4与点3之间的角度a,另一组是点2与点1之间的角度b。通过比较这两个角度的差值(取绝对值),我们可以评估大拇指的整体弯曲程度。如果这个差值的绝对值小于预设的阈值(如12度),则判断大拇指处于相对伸直的状态。类似地,这一逻辑也被应用于其他四根手指的弯曲状态判断。

基于手指弯曲程度的手势识别逻辑

一旦我们掌握了每根手指的弯曲状态,接下来的步骤就是将这些信息整合起来,以识别出用户所做出的具体手势及其对应的数字。以数字五和数字四为例,如果系统检测到所有五根手指均处于伸直状态,那么它会自动将该手势识别为数字五。相反,如果仅大拇指呈现弯曲状态,而其余四根手指(食指、中指、无名指、小指)均伸直,则系统会判断该手势为数字四。

这一识别逻辑可以进一步扩展,涵盖更多的手势和数字。通过为每种手势定义一套明确的弯曲状态组合规则,并不断优化这些规则以适应不同用户的手型和习惯,我们可以使手势识别系统更加智能、准确和易于使用。

总的来说,我的这一手势识别方法充分利用了MediaPipe在手掌关键点识别方面的优势,通过精细分析手指的弯曲状态,实现了对手势的准确识别和数字的对应判断。

手指位置:

 【示范图】

【效果展示】

【测试通过环境】

opencv-python==4.8.0.76
mediapipe==0.10.3
pyqt5

【部分实现代码】

# -*- coding: utf-8 -*-
import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QFileDialog, QLabel, QApplication
import image_rc
import threading
import cv2
import numpy as np
import time
from GestureDetector import *


class Ui_MainWindow(QtWidgets.QMainWindow):
    signal = QtCore.pyqtSignal(str, str)

    def setupUi(self):
        self.setObjectName("MainWindow")
        self.resize(1280, 728)
        self.centralwidget = QtWidgets.QWidget(self)
        self.centralwidget.setObjectName("centralwidget")
        self.detector=GestureDetector()

        self.picture = QtWidgets.QLabel(self.centralwidget)
        self.picture.setGeometry(QtCore.QRect(260, 10, 1010, 630))
        self.picture.setStyleSheet("background:black")
        self.picture.setObjectName("picture")
        self.picture.setScaledContents(True)


        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(10, 1, 72, 21))
        self.label_3.setObjectName("label_3")
        self.hs_conf = QtWidgets.QSlider(self.centralwidget)
        self.hs_conf.setGeometry(QtCore.QRect(10, 30, 181, 22))
        self.hs_conf.setProperty("value", 75)
        self.hs_conf.setOrientation(QtCore.Qt.Horizontal)
        self.hs_conf.setObjectName("hs_conf")
        self.hs_conf.valueChanged.connect(self.conf_change)
        self.dsb_conf = QtWidgets.QDoubleSpinBox(self.centralwidget)
        self.dsb_conf.setGeometry(QtCore.QRect(200, 30, 51, 22))
        self.dsb_conf.setMaximum(1.0)
        self.dsb_conf.setSingleStep(0.01)
        self.dsb_conf.setProperty("value", 0.75)
        self.dsb_conf.setObjectName("dsb_conf")
        self.dsb_conf.valueChanged.connect(self.dsb_conf_change)
        self.dsb_iou = QtWidgets.QDoubleSpinBox(self.centralwidget)
        self.dsb_iou.setGeometry(QtCore.QRect(200, 100, 51, 22))
        self.dsb_iou.setMaximum(1.0)
        self.dsb_iou.setSingleStep(0.01)
        self.dsb_iou.setProperty("value", 0.75)
        self.dsb_iou.setObjectName("dsb_iou")
        self.dsb_iou.valueChanged.connect(self.dsb_iou_change)
        self.hs_iou = QtWidgets.QSlider(self.centralwidget)
        self.hs_iou.setGeometry(QtCore.QRect(10, 100, 181, 22))
        self.hs_iou.setProperty("value", 75)
        self.hs_iou.setOrientation(QtCore.Qt.Horizontal)
        self.hs_iou.setObjectName("hs_iou")
        self.hs_iou.valueChanged.connect(self.iou_change)
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(10, 70, 72, 21))
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(10, 130, 240, 21))
        self.label_5.setObjectName("label_5")
        self.label_5.setStyleSheet("background:black")
        self.label_5.setScaledContents(True)
        self.label_5.setPixmap(QPixmap('./images/logo.jpg'))

 【视频演示】

基于mediapipe深度学习算法的手势数字0-9识别系统python源码+精美GUI界面_哔哩哔哩_bilibili【测试通过环境】opencv-python==4.8.0.76mediapipe==0.10.3pyqt5更多实现细节和源码下载参考博文:https://blog.csdn.net/FL1623863129/article/details/142632591, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:yolov9+deepsort+pyqt5实现目标追踪结果演示,别再学按键精灵和易语言了 python可以直接用中文编写脚本了,yolov8 TensorRT C++ C#部署,将yolov8封装成一个类几行代码完成语义分割任务,C#实现全网yolov7目前最快winform目标检测,基于yolov8+deepsort实现目标追踪视频演示,使用C#的winform部署yolov8的onnx实例分割模型,基于opencvC++版本yolov8-onnx和bytetrack追踪算法实现目标追踪,使用C++部署yolov8的onnx和bytetrack实现目标追踪,用Python训练AI自动玩王者荣耀,Python自动化脚本简直不要太秀!全程无需自己动手操作(附源码)icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1VWxrefEqx/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee

【源码下载地址】

https://download.csdn.net/download/FL1623863129/89815307


http://www.kler.cn/news/324990.html

相关文章:

  • 9-pg内核之锁管理器(四)常规锁
  • [前端]DOM+CSS+HTML实现水波进度效果
  • SpringBoot 流式输出时,正常输出后为何突然报错?
  • 使用Prometheus进行系统监控,包括Mysql、Redis,并使用Grafana图形化表示
  • JVM和GC监控技术
  • 前端html+css+js 基础总结
  • Ubuntu24.04 yum安装
  • Android问题笔记五十:构建错误-AAPT2 aapt2-7.0.2-7396180-windows Daemon
  • “滑动窗口”思想在算法里面的应用
  • llama3.1 8b instruct的function calling的template解析
  • C++第五讲(1):STL--string--各个函数的使用方法
  • 在线支付系统
  • 无人机之模拟图传篇
  • 交互式低延迟音频解码器
  • QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
  • 计算机毕业设计之:宠物互助平台的微信小程序系统(源码+文档+讲解)
  • Java | Leetcode Java题解之第429题N叉树的层序遍历
  • Go 语言框架接入阿里云的报警通知与日志实时追踪与监控
  • 从0学习React(2)
  • 海云安董事长谢朝海博士出席2024年中国国际服务贸易交易会“大模型应用创新论坛”
  • Rust调用tree-sitter支持自定义语言解析
  • JavaScript中的输出方式
  • Android页面跳转与返回机制详解
  • 用友畅捷通-TPlus FileUploadHandler.ashx 任意文件上传
  • [报错解决] 运行MATCHA时需要在线下载Arial.TTF字体,但是无法连接huggingface
  • 阿里云AlibabaCloudLinux php 安装 mysqli 扩展
  • 基于Dockerfile打包算法镜像
  • Prometheus+Grafana+elasticsearch_exporter监控elasticsearch的简单配置过程
  • fmql之Linux阻塞和非阻塞IO
  • 性能调优知识点(mysql)三