Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 骨架、手势周期在Kinect应用中有什么用途?_C#_Windows_Kinect_Kinect Sdk_Gesture Recognition - Fatal编程技术网

C# 骨架、手势周期在Kinect应用中有什么用途?

C# 骨架、手势周期在Kinect应用中有什么用途?,c#,windows,kinect,kinect-sdk,gesture-recognition,C#,Windows,Kinect,Kinect Sdk,Gesture Recognition,我正在编写一个基于Kinect的应用程序。我需要做一个向右挥手的手势。我在互联网上找到了一段使用C#的代码片段,但我对这段代码有些怀疑。你能帮我吗 守则: public class KinectClass { public void KinectInitialize () { m_myKinect.Start(); m_myKinect.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seate

我正在编写一个基于Kinect的应用程序。我需要做一个向右挥手的手势。我在互联网上找到了一段使用C#的代码片段,但我对这段代码有些怀疑。你能帮我吗

守则:

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();
            }
        }
    }
}
此外,还有一个用于检查波函数的手势类:

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;
    }
}
类手势
{
私有列表骨架历史;
私有列表localSkeletonHistory;
public void UpdateSkeletonHistory(骨架骨架数据)
{
SkeletonHistory.Add(SkeletonData);
如果(SkeletonHistory.Count>90)
{
骨骼历史。移除(0);
}
回来
}
公共短期检测测试()
{
短sReturnvalue=-1;
int-gesturePeriod=2;
int indexesPerSecond=30;
int indexesToCheck=gesturePeriod*indexesPerSecond;
localSkeletonHistory=新列表(SkeletonHistory);
if(m_SkeletonHistory.Count>索引检查)
{
localSkeletonHistory=新列表(m_SkeletonHistory);
if(waveright())
{
控制台。Writeline(“waveright”);
}
}
}
二等兵布尔·韦弗里特()
{
Console.WriteLine(“波右启动”);
bool Movedright=false,
Movedleft=false;
浮动参考距离=0.2F;
float startPos=localSkeletonHistory[0]。关节[JointType.HandLeft]。位置.X;
for(int i=0;i
  • 你能解释一下waveright函数吗

  • 你需要记住的是,仅仅因为手相对于身体的位置是正确的,并不意味着他们挥舞的方向是正确的

    波浪右侧是向右侧的过渡。因此,您无法通过当前位置确定它。这就是为什么您需要使用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
    
    当然,一只手会向右移动很多次,这并不意味着它是向右挥手。所以你需要确定一只手必须向右移动多长时间,才能成为真正的向右挥手姿势

    refDistance是一种表示手需要至少移动此距离才能被归类为右挥手的方式

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

    int indexesToCheck = gesturePeriod * indexesPerSecond;
    
    msdn文档实际上非常适用于以下内容:

    我发现这本书非常适合开始这方面的工作:


    在这个概念中,什么是'gesturePeriod,indexesPerSecond=30;indexesToCheck=gesturePeriod*indexesPerSecond;`?以及0.1和0.2F refdistance?@user39320更新了答案以反映评论@Robben_Ford_Fan_boy谢谢..我还有另一个类似的疑问,我是在暗示waveright,为什么编码器使用
    关节[JointType.HandLeft]。位置
    ?什么是X&Y轴?此轴有任何有用的文档吗?还有
    startPos=localSkeletonHistory[0]的重要性。关节[JointType.HandLeft].Position.X;
    ?@user39320看看我添加的链接。@user39320没问题。享受Kinect的开发。在克服了第一个障碍后,我发现它非常有趣。一旦我阅读了我链接的书,一切都开始变得有意义了。