(四)Qt 动态手势识别“手掌随动”+“握拳选择”

系列文章目录

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

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


1、前言

  本系列博客第(一)、(二)、(三)篇分别介绍了如何建立一个Qt软件界面用于作为演示动态手势识别的载体,本文为该系列第(四)篇博客,将融合前三篇博客所述,完成一个阶段性的演示demo。

1.1 目标

  本篇博客主要记录了在Qt平台实现动态手势“手掌随动”+“握拳选择”的过程。
  所谓“手掌随动”即在摄像头前移动操作人的手掌,在软件界面中将有个类似鼠标的“小圆”跟随手掌的移动而移动。
  “握拳选择”则是令手部进行一次“握拳”动作,则产生一种“选中”的效果出来。


2、效果

  为了便于观察手势识别结果以及原始手势图像,我分别打开两个Widget窗口,左边的窗口用于显示识别结果,右边为摄像头实时画面。
  左边的窗口中有8个黄色小窗口,有一个类似鼠标功能的“小圆点”用于随动,当“小圆点”移动至某个黄色小窗口上时,该小窗口将变色,于此同时产生类似鼠标移入时的音效。
  当在黄色小窗口内做“握拳选择”的动作时,被选中的小窗口将立即变色,当“小圆点”移出该小窗口时,其颜色恢复为黄色。

  先看演示效果视频:

动态手势识别_随动+选择(视角1)

动态手势识别_随动+选择(视角2)

效果演示动态图

在这里插入图片描述

图1 “手掌随动”效果gif图

在这里插入图片描述

图2 “握拳选择”动态手势识别效果gif图

2、代码实现

2.1 核心代码

  这里面需要搞清楚每个类的作用,以及类与类之间的关系,信号槽的连接等一系列逻辑问题。

    QObject::connect(&udpServer, SIGNAL(receivedPoints(QList<QPointF>*)),w.ui->widget, SLOT(point_update(QList<QPointF>*)));
    QObject::connect(&udpServer, SIGNAL(receivedPoints(QList<QPointF>*)),&handposturedetect, SLOT(point_update(QList<QPointF>*)));
    QObject::connect(w.ui->widget, SIGNAL(paly_sound(int)),&sound, SLOT(play(int)));
    QObject::connect(&handposturedetect, SIGNAL(send_selected()),w.ui->widget, SLOT(select_widget()));

  下面是识别“握拳选择”的算法。

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 "";
}

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


总结

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang_chao118

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值