首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Kinect SDK 1.8不跟踪Kinect手关节的原因

使用Kinect SDK 1.8不跟踪Kinect手关节的原因
EN

Stack Overflow用户
提问于 2014-06-11 16:27:23
回答 1查看 684关注 0票数 4

我已经在这方面做了很长一段时间了,我找不到为什么(大多数时候) HandJoint没有被跟踪。代码被调整以避免出现这种情况(这就是为什么所有的空值和空号都在那里)。我在Kinect SDKV1.8中使用了C#。

我以前从来没有在这里贴过,所以所有的评论都被接受了。

代码语言:javascript
复制
 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;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-13 09:05:04

问题

你的问题是从SkeletonFrame获取你的骨骼

SkeletonFrame.OpenSkeletonFrame()总是用X对象返回数组.被跟踪的人不一定是数组中的第一个骨架。

所以你有时候会跟踪你的手。有时,跟踪的骨架是列表中的第一个(returnPosFromHand(skeleton[0]);)。

溶液

遍历框架数组,检查跟踪哪个骨架并使用该框架。你可以按Z-索引排序,也可以用传感器选择最近的一个.然后把这个骨架传递给你的函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24167984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档