Kinect应用程序中的“骨架,手势”时期有什么用?

用户39320

我正在编写一个基于Kinect的应用程序。我需要执行右挥手势。我使用C#从Internet找到了一个代码片段,但是对此代码有些疑问。你能帮助我吗?

编码:

public class KinectClass
{
    public void KinectInitialize ()
    {
        m_myKinect.Start();
        m_myKinect.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated;
        m_myKinect.SkeletonFrameReady += m_myKinect_SkeletonFrameReady;
    }

    void m_myKinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        using (SkeletonFrame frame = e.OpenSkeletonFrame())
        {
            if (frame != null)
            {
                if (0 == frame.SkeletonArrayLength) return;
                m_skeletons = new Skeleton[frame.SkeletonArrayLength];
                if (m_skeletons == null) return;
                frame.CopySkeletonDataTo(m_skeletons);
            }
        }

        foreach (Skeleton skeleton in m_skeletons)
        {
            if (skeleton.TrackingState == SkeletonTrackingState.Tracked)
            {
                UpdateSkeletonHistory(skeleton);
                value = gestureobject.Detectgesture();
            }
        }
    }
}

此外,还有一个Gesture类正在检查wave函数:

class Gesture
{
    private List<Skeleton> SkeletonHistory;
    private List<Skeleton> localSkeletonHistory;

    public void UpdateSkeletonHistory(Skeleton SkeletonData)
    {
        SkeletonHistory.Add(SkeletonData);

        if (SkeletonHistory.Count > 90)
        {
            SkeletonHistory.RemoveAt(0);
        }

        return ;
    }

    public short Detectgesture()
    {
        short sReturnvalue = -1;
        int gesturePeriod = 2;
        int indexesPerSecond = 30;
        int indexesToCheck = gesturePeriod * indexesPerSecond;
        localSkeletonHistory = new List<Skeleton>(SkeletonHistory);

        if (m_SkeletonHistory.Count > indexesToCheck)
        {
            localSkeletonHistory = new List<Skeleton>(m_SkeletonHistory);

            if( waveright() )
            {
                Console.Writeline("waveright");
            }
        }
    }

    private bool waveright()
    {
        Console.WriteLine("wave right START");
        bool Movedright = false,
        Movedleft = false;

        float refDistance = 0.2F;

        float startPos = localSkeletonHistory[0].Joints[JointType.HandLeft].Position.X;

        for (int i = 0; i < localSkeletonHistory.Count; i++)
        {
            if (!(localSkeletonHistory[i].Joints[JointType.HandLeft].Position.Y <= localSkeletonHistory[i].Joints[JointType.Head].Position.Y))
            {
                break;
            }
            if (localSkeletonHistory[i].Joints[JointType.HandLeft].Position.X >= (startPos + refDistance))
            {
                Movedright = true;
            }
            if (Movedright && Math.Abs(localSkeletonHistory[i].Joints[JointType.HandLeft].Position.X - startPos) <= 0.1 )
            {
                Movedleft = true;
                m_SkeletonHistory.Clear();
                break;
            }
        }

        return Movedleft;
    }
}

我可以理解Kinect函数,但是我对手势函数感到困惑。我的问题如下:

  • 他们为什么要创建SkeletonHistory?
  • 手势和索引PerSecond的需求是什么?
  • 他们为什么检查(m_SkeletonHistory.Count> indexsToCheck)?
  • 你能解释一下波函数吗?
Robben_Ford_Fan_boy

您需要记住的是,仅仅因为手相对于身体的位置是正确的。这并不意味着他们挥舞着正确的声音。

波浪右移是向右移的过渡。因此,您无法通过当前位置确定该位置。这就是为什么您需要使用SkeletonHistory跟踪以前的位置的原因。

因此,该算法的简要概述是:

For the previous positions since the last triggered gesture:
     If each Skeleton's Y position is greater than the last, then the person is waving right

当然,一只手会向右移动很多次,但这并不意味着它是右挥手。因此,您需要确定一只手必须向右移动多长时间,才能使其成为真正的waveRight手势。

refDistance是一种说法,手必须至少移动此距离才能被归类为波权。

在这里,我相信编码人员说的是手势至少需要持续2秒钟。因此,如果我们每秒获得30个骨架,那么我们需要检查最后60个骨架:

int indexesToCheck = gesturePeriod * indexesPerSecond;

实际上,msdn文档对于这些东西非常有用:

https://msdn.microsoft.com/zh-CN/library/jj131025.aspx

我发现这本书非常适合入门:

使用Kinect for Windows软件开发套件进行编程(开发人员参考)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Unity / MRTK应用程序中的HoloLens1上无法使用“空中敲击”手势?

后台应用程序以收听拖动手势

如何在React Native应用程序中删除iOS的原生手势?

使用滑动手势在多页jQuery移动应用程序中更改页面

混合控制台应用程序中的多个平移手势

在混合应用程序中反应原生手势应答器

TTS 在 tensorflow 中无法用于手势检测 android 应用程序

将免触摸手势整合到我的Android应用程序中

Meteor 应用程序中特殊的“公共”文件夹有什么用?

在我们的应用程序中添加Google Ads(使用AdMob)有什么用?

Windows 8.1应用程序和顶部与底部边缘手势

我的Android手势识别应用程序需要分类方法吗?

在Windows 8.1应用程序中使用C#进行手势

在angularjs应用程序中添加Bootstrap css文件和js文件引用有什么用?

具有连接数据库甚至背景的应用程序有什么用

编写AngularJs应用程序时Jade或Handlebars有什么用

在本机应用程序中使用 android 文件夹有什么用?

用捏手势限制平移手势

如何在kinect v2中使用右手手势?

如何在Apple Watch应用中识别手势?

我的预发行版应用程序在iTunes Connect中已经“处理”了一个多星期,有什么用?

在Android中具有手势的VideoView(滑动功能)

SwiftUI中如何有2个手势?

动态手势识别和使用 Python 的 Kinect?

基于神经网络的kinect手势识别

如果我将数据库用于我的React应用程序,redux有什么用?

创建基本主题并将其扩展为您的应用程序主题有什么用

引导程序中的偏移量有什么用?

手势名称是什么?