Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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 SDK 1.8跟踪Kinect手关节_C#_Kinect - Fatal编程技术网

C# 为什么不使用Kinect SDK 1.8跟踪Kinect手关节

C# 为什么不使用Kinect SDK 1.8跟踪Kinect手关节,c#,kinect,C#,Kinect,我已经在这方面工作了很长一段时间了,我不知道为什么(大多数时候)手关节没有被跟踪。代码经过修改以避免出现这种情况(这就是为什么所有的null和nullables都存在的原因)。我在Kinect SDK v1.8中使用了C# 我以前从未在这里发布过,所以每一条评论都是值得赞赏的 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Kine

我已经在这方面工作了很长一段时间了,我不知道为什么(大多数时候)手关节没有被跟踪。代码经过修改以避免出现这种情况(这就是为什么所有的null和nullables都存在的原因)。我在Kinect SDK v1.8中使用了C#

我以前从未在这里发布过,所以每一条评论都是值得赞赏的

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using Microsoft.Kinect;
 using System.Windows;

 namespace Arcade_Kinect.Kinect
 {
    class KinectAddons
    {
    public KinectSensor kinect;
    public Point? punto;
    public JointType hand;

    public KinectAddons(bool leftHanded, KinectSensor sensor)
    {
        this.kinect = sensor;
        if (kinect != null)
        {
            kinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinect_SkeletonFrameReady);
            kinect.Start();
            try
            {
                kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
                kinect.SkeletonStream.Enable();
                try
                {
                    kinect.DepthStream.Range = DepthRange.Near;
                    kinect.SkeletonStream.EnableTrackingInNearRange = true;
                }
                catch (InvalidOperationException)
                {

                    kinect.DepthStream.Range = DepthRange.Default;
                    kinect.SkeletonStream.EnableTrackingInNearRange = false;
                }
            }
            catch (InvalidOperationException) { }
        }
        if (leftHanded)
            this.hand = JointType.HandLeft;
        else
            this.hand = JointType.HandRight;

    }

    void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        Skeleton[] skeleton = new Skeleton[0];

        using (SkeletonFrame sf = e.OpenSkeletonFrame())
        {
            if (sf != null)
            {
                skeleton = new Skeleton[sf.SkeletonArrayLength];
                sf.CopySkeletonDataTo(skeleton);
                punto = returnPosFromHand(skeleton[0]);
            }
        }
    }

    //saves x and y of the hand
    public Point? returnPosFromHand(Skeleton sk)
    {
        DepthImagePoint depthPoint = new DepthImagePoint();
        bool notWorking = true;
        try
        {
            if (sk.Joints[this.hand].TrackingState == JointTrackingState.Tracked)
            {
                notWorking = false;
                depthPoint = this.kinect.CoordinateMapper.MapSkeletonPointToDepthPoint(sk.Joints[this.hand].Position, DepthImageFormat.Resolution640x480Fps30);
            }
        }
        catch (IndexOutOfRangeException)
        {
            System.Console.WriteLine("Hand capture was lost" + this.hand.ToString());
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
        if (notWorking)
            return null;
        return new Point(depthPoint.X, depthPoint.Y);
    }

        //returns last know value
        public double? readNext()
        {
            if (this.punto.HasValue)
                return punto.Value.X;
            return null;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Microsoft.Kinect;
使用System.Windows;
命名空间Arcade_Kinect.Kinect
{
类KinectAddons
{
公共kinect传感器kinect;
公共点?平托;
公共关节型手;
公共KineTAddons(布尔左撇子,KineTSensor)
{
this.kinect=传感器;
如果(kinect!=null)
{
kinect.SkeletonFrameReady+=新事件处理程序(kinect_SkeletonFrameReady);
kinect.Start();
尝试
{
kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
kinect.SkeletonStream.Enable();
尝试
{
kinect.depthream.Range=DepthRange.Near;
kinect.SkeletonStream.EnableTrackingInNearRange=true;
}
捕获(无效操作异常)
{
kinect.DepthStream.Range=DepthRange.Default;
kinect.SkeletonStream.EnableTrackingInNearRange=false;
}
}
捕获(无效操作异常){}
}
如果(左撇子)
this.hand=JointType.HandLeft;
其他的
this.hand=JointType.HandRight;
}
void kinect_SkeletonFrameReady(对象发送方,SkeletonFrameReadyEventArgs e)
{
骨架[]骨架=新骨架[0];
使用(SkeletonFrame sf=e.OpenSkeletonFrame())
{
如果(sf!=null)
{
骨架=新骨架[sf.SkeletonArrayleLength];
sf.CopySkeletonDataTo(骨架);
punto=returnPosFromHand(骨架[0]);
}
}
}
//保存手的x和y
公共点?从手返回(Skeleton sk)
{
DepthImagePoint depthPoint=新的DepthImagePoint();
布尔不工作=真;
尝试
{
if(sk.Joints[this.hand].TrackingState==JointTrackingState.Tracked)
{
不工作=错误;
depthPoint=this.kinect.CoordinateMapper.MapSkeletonPointToDepthPoint(sk.Joints[this.hand].Position,DepthImageFormat.Resolution640x480Fps30);
}
}
捕获(IndexOutOfRangeException)
{
System.Console.WriteLine(“手动捕捉丢失”+this.Hand.ToString());
}
捕获(例外e)
{
MessageBox.Show(e.Message);
}
如果(不工作)
返回null;
返回新点(depthPoint.X,depthPoint.Y);
}
//返回最后知道的值
公共双精度?readNext()
{
if(this.punto.HasValue)
返回punto.Value.X;
返回null;
}
}
}

问题

你的问题是从骨架框架中获取骨架

SkeletonFrame.OpenSkeletonFrame()
始终返回包含X对象的数组。 被跟踪的人不一定是阵列中的第一个骨架

这就是为什么你有时会被跟踪的原因。有时,跟踪的骨架是列表中的第一个(
returnPosFromHand(骨架[0]);

解决方案

迭代骨架数组,检查跟踪的骨架并使用该骨架。您可以按Z索引订购,也可以选择与传感器最近的一个。然后将该骨架传递给函数