Qt 动态手势识别“握拳”

这篇具有很好参考价值的文章主要介绍了Qt 动态手势识别“握拳”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

通过Qt实现手势识别控制软件操作相关系列技术方案

(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现
(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果
(三)Qt 动态手势识别“握拳”
(四)Qt 动态手势识别“手掌随动”+“握拳选择”
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果


1、前言

1.1 目标

  本篇博客主要记录了在Qt平台实现动态手势“握拳”的识别过程。
  首先要明确所谓动态手势识别的含义,动态手势识别是区别于静态手势识别而言的。

1.2 静态手势识别

1.2.1 定义

  “静态手势识别”,就是算法的输入只有“一帧图像”,输出则是关于此图像中的手的各种状态、信息等,即检测、识别出单帧图像上的人手,此状态可能包含了如下信息内容:
  (1)手部形状的最小外接矩形框,该框四顶点在图像中的像素坐标值;
  (2)手部形状的分割区域,该区域按像素点划分后的像素点坐标集合;
  (3)手部按关节划分后,各个关节点的图像像素点坐标值;
  根据上述输出的信息内容,根据某些经验定义,从而确定某个手势的具体含义如:
  (1)根据手部各关节点的相对位置坐标、关节角度等,可以确定一些常用的手势,比如说,食指伸出,指向上方,其余手指握拳,这种手势可以判定为“数字1”,再比如说,五根手指全部伸出两两手指保持一定夹角,这种手势可以判定为“数字5”等等;
  (2)根据手部所在输入图像上的具体像素点位置,确定此时手所位于的区域,从而确定其表示的含义,比如,在交通指挥时,交警的手位于左边还是右边决定了正向行驶过来的车辆是能够向左转还是向右转(此处只是打比方)。

1.2.2 难点

  (1)样本数据量,现有的静态手势识别几乎均通过神经网络算法,需要大量手部样本,要经过清理、标注等环节,对样本外的手的图像适应性不一定很准确;
  (2)环境因素,诸如光照、背景、遮挡等因素,造成图像质量差,从而识别效果不好;

1.2.3 现有算法、框架

  现有的手势识别框架主要有OpenPose、Mediapipe、DeepLabCut、Detraction等(这里只列举了本人比较熟悉的几种),有些用python调用可能比较快,有的可能C++接口都没有开放。
  可以考虑使用上述框架的python脚本先获取手部数据,然后通过网络通信的方式与Qt端软件进行通信。

1.3 动态手势识别

1.3.1 定义

  “动态手势识别”,本质与“静态手势识别”有一定的区别,“静态手势识别”仅考虑“一帧图像”,“动态手势识别需要考虑,在某一连续的时间段内的多帧静态手势,动态手势识别的算法输入为“一段事件内的连续多帧图像”。动态手势识别分类、判定时应具体考虑以下因素:
  (1)各帧图像“静态手势”的单独识别结果;
  (2)按时间前后顺序,各帧图像“静态手势”识别结果之间的关联;
  (3)在时间、空间双重维度下,手势的具体信息,如“速度”
、“加速度”等;

1.3.2 难点

  在实际应用中,往往是通过传感器(如摄像头,TOF,雷达等),实时拍摄手部的画面,这就牵扯到如何判断一个手势的开始与结束了。其实这种问题,在语音识别中也会遇到,即“如何判断一段语音需要去做语音识别”,而不是每时每刻都在让计算机不停地做识别不同的语句,仅仅在有需要时做识别,现在常用的方法就是在语音的开始处加“唤醒语句”,即在设备待机状态时,仅需要侦测特定的语句即可,当侦测到特定语句后,进入整正的语音识别算法中去。
  现在大部分的语音识别大厂,如苹果的“Siri”、小米的“小爱同学”、百度的“小度”、比亚迪汽车等均是这样做的,先设定一个“唤醒语句”,当触发了该唤醒语句后再进行相应的操作。
  在手势识别时,也可以通过类似上述操作的方式进行“唤醒”,可以设置某一特定的静态手势作为唤醒手势,在检测到该手势后,进入“动态手势监测程序”,从而避免在平常状态(未进行手势识别)时误触发动态手势识别程序,造成误识别等。
  同样,判断手势的结束,类比于语音识别的结束,当检测不到说话人的语音输入一段时间后,则被程序可认为结束。手势识别的是否结束,可通过前后帧图像差来进行判断,当前后帧图像差别小于一定阈值累计达到一定帧数后,可判断动态手势的结束。
  上面所说这种类似语音的“唤醒”功能的方式判断手势的启动方式,在某些具体环境下可能不行,即不能指定“唤醒”启动方式时,当某场景需要你直接动作,不能有“唤醒”阶段时,又不能这样干。具体实现可通过判断这段动态手势中,各静态手势出现的相对时间、相对帧数,以及每帧之间的位置、顺序关系。


2、效果

  为了便于观察手势识别结果以及原始手势图像,我分别打开两个Widget窗口,左边的窗口用于显示识别结果,每当检测到一次“握拳”动作,左边Widget窗口的底色将会改变一次,同时其正中的数字(代表已经识别出“握拳”的次数)增加1。

  先看演示效果视频:

动态手势识别-握拳(视角1)

动态手势识别-握拳(视角2)

效果演示动态图

Qt 动态手势识别“握拳”
Qt 动态手势识别“握拳”

图1 “握拳”动态手势识别效果示意图

2、代码实现

2.1 思路

  要检测出“握拳”动作,可以将握拳的动态过程静态化,可以观察下图,为握拳动作的静态分解图。
Qt 动态手势识别“握拳”

图2 “握拳”动态手势的静态分解示意图

  “握拳”的动态手势其实能够分解为:先开始有一段“连续的手掌形状”,紧接着有一段“连续的握拳形状”,再紧接着一段“连续的手掌形状”,只要在动态手势序列中检测出有类似上述存储规则的动态手势,则可判定为“握拳”动作。

2.2 核心代码

QString HandPostureDetect::dynamic_gesture_recognize(const QQueue<QString>& gestureQueue)
{
    int state = 0; 
    int countFive1 = 0; 
    int countFist = 0; 
    int countFive2 = 0; 
    for (const QString& gesture : gestureQueue)
    {
        if (state == 0)
        {
            if (gesture == "five")
            {
                countFive1++;
                if (countFive1 >= 5)
                {
                    state = 1;
                    countFive1 = 0;
                }
            }
            else
            {
                countFive1 = 0;
            }
        }
        else if (state == 1)
        {
            if (gesture == "fist")
            {
                countFist++;
                if (countFist >= 5)
                {
                    state = 2;
                    countFist = 0;
                }
            }
            else
            {
                countFist = 0;
            }
        }
        else if (state == 2)
        {
            if (gesture == "five")
            {
                countFive2++;
                if (countFive2 >= 5)
                {
                    if(pre_condition == 0)
                    {
                        qDebug()<<"select_"<<count;
                        count++;

                        pre_condition = 1;
                        emit send_result(pre_condition);
                        return "select";
                    }
                    if(pre_condition == 1)
                    {
                        return "";
                    }
                }
            }
            else
            {
                countFive2 = 0;
            }
        }
    }

    if(pre_condition == 1)
    {
        pre_condition = 0;
    }
    emit send_result(pre_condition);
    return "";
}

  本项目所有代码的获取,请私信与本人联系。文章来源地址https://www.toymoban.com/news/detail-505365.html


总结

  本系列文章,通过动、静态手势识别技术方式操控Qt界面软件实现相关操作功能:
(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现
(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果
(三)Qt 动态手势识别“握拳”
(四)Qt 动态手势识别“手掌随动”+“握拳选择”
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

  本项目所有代码的获取,请私信与本人联系。

到了这里,关于Qt 动态手势识别“握拳”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git系列文章目录 - Git 子模块git submodule使用

    项目中有时会遇到会涉及子模块的使用,比如 flatpak 项目包含多个子模块。 进入需要添加子模块的目录,一般是项目根目录。 删除子模块目录及源码: 删除项目目录下.gitmodules文件中子模块相关条目: 删除配置项中子模块相关条目: 删除模块下的子模块目录: 清除子模块

    2024年01月20日
    浏览(42)
  • 基于YOLOv5系列【n/s/m/l】模型开发构建人体手势目标检测识别分析系统

    人体手势检测识别是指通过计算机视觉和深度学习技术,自动地识别和理解人体的手势动作。这项技术可以应用于各种领域,如人机交互、虚拟现实、智能监控等。 下面是一般的人体手势检测识别流程: 数据采集:首先需要收集包含手势动作的训练数据。这些数据可以通过

    2024年02月11日
    浏览(43)
  • AIGC系列文章目录 第一章 AIGC 与AI对话,如何写好prompt?

    生成式人工智能AIGC(Artificial Intelligence Generated Content)是人工智能1.0时代进入2.0时代的重要标志。 AIGC对于人类社会、人工智能的意义是里程碑式的。 短期来看 AIGC改变了基础的生产力工具, 中期来看 会改变社会的生产关系, 长期来看 促使整个社会生产力发生质的突破,在

    2024年02月06日
    浏览(40)
  • 基于CNN的动态手势识别:Real-time Hand Gesture Detection and Classification Using Convolutional Neural Networks

    论文链接:https://arxiv.org/abs/1901.10323 论文代码(PyTorch版本):https://github.com/ahmetgunduz/Real-time-GesRec 论文出处:CVPR2019 从视频流中实时识别动态手势是一项具有挑战性的任务,因为(i)在视频中没有指示手势何时开始和结束,(ii)所表演的手势只应识别一次,以及(iii)考虑内存和功

    2024年02月05日
    浏览(27)
  • AIGC系列文章目录 第三章 AIGC 简单易用免费的AI图像生成器: Stable Diffusion

    目前亲测体验的AI图像生成器有NovelAI、MJ和Stable Diffusion。其中, 支持免费、无限生成、超高专业级画质 的只有 Stable Diffusion 。 Stable Diffusion 由 Stable Diffusion XL 提供支持,是一款最先进的工具,可以将您的想象力变为现实。 只需点击几下和简单的文本输入,您就可以创建令人

    2024年02月03日
    浏览(54)
  • java通过FTP跨服务器动态监听读取指定目录下文件数据

    1、文件数据在A服务器(windows)(不定期在指定目录下生成),项目应用部署在B服务器(Linux); 2、项目应用在B服务器,监听A服务器指定目录,有新生成文件,进行读取文件信息,持久化数据; 3、提供两块内容,第一安装windows FTP服务;第二项目源码,希望可以帮助到你

    2024年02月03日
    浏览(43)
  • ARM Coresight 系列文章 8 - ARM Coresight 通过 APBIC 级联使用

    请阅读 【ARM Coresight SoC-400/SoC-600 专栏导读】 上篇文章:ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 异构 cpu 内部 coresight 组件 APBIC 可以连接一个或者多个APB BUS masters, 例如连接一个 APB-AP 组件和带有 APB 接口的 Processor, APBIC 通常会带有一个ROM Table,位于0x0000_0000处。

    2024年02月16日
    浏览(34)
  • 手势识别(二) - 静态手势动作识别

    我公司的科室开始在公众号上规划一些对外的技术文章了,包括实战项目、模型优化、端侧部署和一些深度学习任务基础知识,而我负责人体图象相关技术这一系列文章,偶尔也会出一些应用/代码解读等相关的文章。 文章在同步发布至公众号和博客,顺带做一波宣传。有兴

    2024年02月04日
    浏览(41)
  • qt 系列(二)---qt designer通过设置控件样式表进行背景颜色设置

    1. 前言 一般Layouts不可以进行改变样式表,当我们想修改背景样式表,同时又不改变其他控件的颜色时,可以选择List View 控件改变背景颜色。 2. 设置背景 (1)配置 .qrc 文件 新建mypicture.qrc文件,记事本打开 (2)右键选择项目–添加–现有项,选择建立的.qrc文件,此时,项

    2024年02月06日
    浏览(35)
  • Qt+opencv 鼠标画线实现几何图形识别并动态创建

    使用Qt + OpenCV实现,通过鼠标画线绘制几何图形,然后通过opencv进行图形轮廓识别,返回图形顶点,然后创建对应的几何图形添加到场景中。绘制使用QGraphics体系完成。 看效果图: 本文demo在这里 点击下载 环境: Qt5.15.2 + vs2019 64bit 支持图形:直线、圆、椭圆、矩形、三角形。

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包