`
什么世道
  • 浏览: 222212 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Kinect开发之PowerPoint播放助手

阅读更多

   前言:

    之前写过一篇关于姿势(pose)识别的博文,之后又定义了几个姿势实现了体感俄罗斯方块。姿势识别是通过关节点与关节点之间的相对位置关系来进行判断。当判断成立,即执行指定的指令。那么,我们就可以指定姿势实现我们的天花乱坠的想法啦~~~ PPT播放助手应运而生。

 

    基本思路:

     有了Kinect,我们就可以使用手势(手部姿势)来控制幻灯片的播放,而不需要一边演讲一遍按键盘或者手持一个ppt控制器,我们只需要做的就是双手握住头部就实现放映,轻轻的向左或者向右挥一下手就可以控制幻灯片向前或者向后翻一页,双手举起就使屏幕变黑。酷吧。虽然可能在演讲的时候做这个动作可能有点奇怪,但是这也是一种控制幻灯片放映的好方法。

 

    实现Kinect控制幻灯片播放很简单,主要思路是:使用Kinect捕捉人体动作,然后根据识别出来的动作向系统发出点击向前,向后,"F5","B"按键的事件,从而使得幻灯片能够切换,放映,变黑。 这里的核心功能在于手势的识别,我们在开发之前需要定义怎么样的手势算是向前或者向后切换幻灯片。

 

对应关系: 

姿势 对应按键 触发动作
双手抱住头部 F5 放映
向左挥动左手 left 上一页
向右挥动右手 right 下一页
双手举起 B 变黑

 

    

    代码实现

    由于之前几篇博文已经写了获取Kinect各种数据的代码,在此就讨论关键部分的代码。 

由于是姿势控制,自然存在精确度的问题,所以我们需要定义几个阈值,作为判断依据。

 

/// <summary>
/// 手臂水平伸展的阈值
/// </summary>
private const double ArmStretchedThreshold = 0.45;

/// <summary>
/// 手臂垂直上举的阈值
/// </summary>
private const double ArmRaisedThreshold = 0.20;

/// <summary>
/// 头离双手距离的阈值
/// </summary>
private const double DistanceThreshold = 0.05; 

 

 

    在控制ppt播放命令中,我们设定,如果双手距离头部小于0.05,认为用户试图进行点击键盘上的F5键,如果右手关节点在x轴上的距离比头部关节点大于0.45的话,认为用户试图进行点击键盘上的right按钮。如果头部关节点位置在x轴方向是比左手关节点在x轴上的位置大于0.45的话,认为用户试图点击键盘上的left按钮。如果双手超过头部高度0.20的话,认为用户试图点击键盘上的B键,0.05、0.45和0.20这几个阈值是通过反复测试的出来的(没错,是Test,而不是Dubug);所以,测试很重要。

    关键代码如下:

/// <summary>
/// 处理手势的方法
/// </summary>
/// <param name="head"></param>
/// <param name="rightHand"></param>
/// <param name="leftHand"></param>
private void ProcessForwardBackGesture(Joint head, Joint rightHand, Joint leftHand)
{
    //若右手位置的横坐标值超过设定的阈值,除法PPT下一页命令
    if (rightHand.Position.X > head.Position.X + ArmStretchedThreshold)
    {
        if (!isForwardGestureActive)
        {
            //激活forward命令,确保每次操作执行一次命令
            isForwardGestureActive = true;

            //模拟鼠标按下“右”方向键
            System.Windows.Forms.SendKeys.SendWait("{Right}");
        }
    }
    else
    {
        isForwardGestureActive = false;
    }

    //若左手位置的横坐标超过设定的阈值,触发PPT上一页命令
    if (leftHand.Position.X < head.Position.X - ArmStretchedThreshold)
    {
        if (!isBackGestureActive)
        {
            //激活back命令,确保每次操作执行一次命令
            isBackGestureActive = true;

            //模拟鼠标按下“左”方向键
            System.Windows.Forms.SendKeys.SendWait("{Left}");
        }
    }
    else
    {
        isBackGestureActive = false;
    }


    //双手同时上举,在控制PPT时让屏幕变黑
    if ((leftHand.Position.Y > head.Position.Y - ArmRaisedThreshold) && (rightHand.Position.Y > head.Position.Y - ArmRaisedThreshold))
    {
        if (!isBlackScreenActive)
        {
            isBlackScreenActive = true;
            System.Windows.Forms.SendKeys.SendWait("{B}");
        }
    }
    else
        {
            isBlackScreenActive = false;
        }

    //判断双手靠近头部,触发PPT放映
    if (Math.Abs(head.Position.Y - rightHand.Position.Y) < DistanceThreshold && (Math.Abs(head.Position.Y - leftHand.Position.Y) < DistanceThreshold && !isForwardGestureActive &&!isBackGestureActive))
    {
        if (!isPresent)
        { 
            isPresent = true;
            System.Windows.Forms.SendKeys.SendWait("{F5}");
        }
    }
    else
    {
        isPresent = false;
    }
}

 

 

    上面的代码中,当判断到用户向右挥手动作是,执行System.Windows.Forms.SendKeys.SendWait("{Right}")语句从而发出点击键盘向右按键; 该方法执行时,要求PowerPoint程序处于当前活动的状态,这样里面的PPT才会向右键盘点击事件。需要注意的是方法中isBackGestureActive,isForwardGestureActive,isBlackScreenActive和isPresent这四个布尔型的标志位,可以防止当用户一直处于某一个动作时会一直发送System.Windows.Forms.SendKeys.SendWait("{xx}")。

 

   上面的方法需要放在sensor_SkeletonFrameReady事件中,首先获取头部,左手右手关节点数据,然后调用该方法。

 

/// <summary>
/// 骨骼事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void sensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    using (var skeletonFrame = e.OpenSkeletonFrame())
    {
        if (skeletonFrame == null)
            return;

        if (skeletons == null ||
            skeletons.Length != skeletonFrame.SkeletonArrayLength)
        {
            skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
        }

        skeletonFrame.CopySkeletonDataTo(skeletons);
    }

    Skeleton closestSkeleton = skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked)
                                        .OrderBy(s => s.Position.Z * Math.Abs(s.Position.X))
                                        .FirstOrDefault();

    if (closestSkeleton == null)
        return;

    var head = closestSkeleton.Joints[JointType.Head];
    var rightHand = closestSkeleton.Joints[JointType.HandRight];
    var leftHand = closestSkeleton.Joints[JointType.HandLeft];

    if (head.TrackingState == JointTrackingState.NotTracked ||
        rightHand.TrackingState == JointTrackingState.NotTracked ||
        leftHand.TrackingState == JointTrackingState.NotTracked)
    {
        //Don't have a good read on the joints so we cannot process gestures
        return;
    }

    //调用填充头和双手位置图案的的方法
    SetEllipsePosition(ellipseHead, head, false);
    SetEllipsePosition(ellipseLeftHand, leftHand, isBackGestureActive);
    SetEllipsePosition(ellipseRightHand, rightHand, isForwardGestureActive);

    //调用处理手势的方法
    ProcessForwardBackGesture(head, rightHand, leftHand);
}

 

 

 

代码已开诚布公到GitHub:https://github.com/Marsyangkang/KinectPowerpointControl

 

Kinect开发系列博文: 

Kinect开发之 Interaction交互设计  
 
Kinect开发之结合Unity3D进行游戏应用开发
 
Kinect开发之体感举起手来程序设计(Kinect俄罗斯方块)
 
Kinect开发之简单姿势识别
 
Kinect开发之获取骨骼关节数据并绘制成火柴人

 

3
0
分享到:
评论

相关推荐

    Kinect开发教程.pdf

    Kinect开发是微软推出的一项技术,它允许开发者利用深度传感器来捕捉和处理人体动作和语音,进而在计算机或其他设备上进行交互。本教程旨在介绍Kinect的开发环境以及如何使用Kinect进行基本开发。开发Kinect应用前,...

    kinect开发核心技术资料

    Kinect开发核心技术资料集合涵盖了多个关键领域,包括基础概念、音频处理、骨骼追踪以及机器学习。这些资源对于理解和掌握Kinect开发技术至关重要。 首先,"kinect核心技术简介"提供了对Kinect开发的基础认识,它...

    Kinect开发初学者案例

    【Kinect开发初学者案例】是一份专为对Kinect技术感兴趣的初学者设计的进阶教程,旨在帮助学习者从零开始掌握如何利用Kinect进行软件开发。Kinect是由Microsoft为XBox360游戏主机设计的一种创新性体感设备,它通过...

    Kinect PowerPoint Control Source

    标题“Kinect PowerPoint Control Source”指的是使用微软的Kinect for Windows SDK在PC上开发的一个C#源代码项目,该项目能够实现对PowerPoint演示文稿的控制。这个功能允许用户通过体感交互,如手势,来操作...

    Kinect开发之获取彩色摄像头数据

    【标题】"Kinect开发之获取彩色摄像头数据"涉及到的是微软Kinect设备的编程应用,主要关注如何通过软件开发获取并处理来自Kinect彩色摄像头的数据。Kinect是一款体感输入设备,广泛应用于游戏、交互式设计和计算机...

    Kinect 开发电子书

    Kinect开发电子书的知识点包括以下几个重要方面: 1. Kinect for Windows SDK概述 Kinect for Windows SDK是由微软研究院提供的一套软件开发工具包,主要面向学术研究和爱好者社区,使他们能够更容易地利用Kinect ...

    kinect for windows 开发从入门到精通

    对于开发者而言,掌握Kinect for Windows的开发技术可以打开新的创新之门。本篇文章将深入探讨如何从零开始,逐步精通Kinect for Windows的开发。 首先,我们要了解的是Kinect的环境配置。安装Kinect for Windows ...

    kinect应用开发实战

    kinect应用开发实战

    (最新全书)Kinect应用开发实战

    《Kinect应用开发实战》是一本全面覆盖Kinect设备开发技术的专业书籍,旨在为不同层次的读者提供深入、实用的指导。Kinect是微软推出的一种创新性体感设备,它通过捕捉人体动作来实现人机交互,广泛应用于游戏、医疗...

    kinect开发书籍

    1. Kinect开发书籍:从题目可以看出,该书籍是关于Kinect开发的教程书籍。Kinect是微软公司推出的一款体感周边设备,主要应用于Xbox游戏机上,但也可以用于个人电脑的开发。Kinect可以捕捉玩家的体态动作和语音命令...

    Azure Kinect 开发入门---加油动作识别[39576].docx

    Azure Kinect 开发入门---加油动作识别 Azure Kinect 是微软推出的一个新一代的人体跟踪和DEPTH sensor,具备高精度的人体跟踪能力和强大的计算能力。通过本示例,我们将了解 Azure Kinect 的基本使用和加油动作...

    kinect控制ppt播放完整源码

    在本项目中,"kinect控制ppt播放完整源码"是一个专为初学者设计的教学资源,旨在教授如何通过Kinect设备控制PowerPoint(PPT)的播放,包括翻页等操作。 首先,我们要了解Kinect SDK(软件开发工具包)。微软提供的...

    kinect 2.0 for Unity开发包

    《Kinect 2.0 for Unity开发包详解》 Unity是一款强大的跨平台游戏开发引擎,广泛应用于游戏制作、虚拟现实、增强现实等领域。在Unity中,开发者可以利用各种硬件设备来扩展交互方式,例如Microsoft的Kinect 2.0。...

    Kinect开发变脸游戏

    【Kinect开发变脸游戏】是一项利用微软的Kinect传感器技术与Visual Studio 2010集成开发环境,结合C#编程语言实现的创新性应用。这个项目特别适合那些对Kinect开发感兴趣或者正在学习这一领域的初学者。下面将详细...

    Kinect v2 Unity 开发包

    《Kinect v2 Unity 开发包详解》 在数字化时代,体感技术为游戏和交互式应用带来了全新的体验。微软的Kinect设备,尤其是第二代(Kinect v2),凭借其高精度的骨骼追踪和深度感知能力,成为了开发者们的重要工具。...

    用Kinect控制powerpoint

    通过这个项目,我们可以学习到如何使用C#与Kinect SDK进行集成开发,理解体感识别的原理,以及如何将这些技术应用到实际的Windows应用程序中,比如控制PowerPoint的播放。同时,这还涉及到事件处理、手势识别算法和...

    kinect开发基本教程

    介绍基本的kinect技术开发的文档!共享给大家使用。

    Kinect2.0开发文档

    最后,Kinect2.0强大的人体骨骼追踪功能也是其亮点之一,能够实现对人体姿势的精确识别与追踪。 综上所述,Kinect2.0不仅提供了丰富的API接口,还涵盖了从基础数据读取到高级应用实现的多个方面,为开发者提供了...

    kinect开发入门文档

    Kinect开发入门文档主要涵盖了如何配置Kinect的开发环境、安装SDK以及如何创建第一个Kinect项目等相关知识点。以下为详细说明: 1. Kinect设备概述 Kinect设备包括一个电动马达,可以在基座和感应器之间调整俯仰...

Global site tag (gtag.js) - Google Analytics