使用kinect sdk在两帧之间的关节速度

时间:2014-05-09 13:34:59

标签: kinect velocity frames

我在这个问题上一直在堆叠,我真的很感激,如果有人可以帮助我。

我在许多论坛上多次问过,我搜索了很多,但没有回答真的帮助了我。

我正在开发一个应用程序,我必须使用vs c#2012和kinect sdk 1.7来计算骨骼体关节的速度

在问这个问题之前我首先要确定事情的逻辑,

如果我理解正确,我正在寻找计算速度的delta_time,不是一帧(1/30秒)的持续时间,但必须从两个时刻计算: 1-在第一帧中检测并保存“关节点”的瞬间 2-在下一帧中检测并保存相同“关节点”的瞬间

如果不是这样,谢谢你澄清事情。

从这个假设开始,我写了一个代码:

  • 检测一个人

  • 跟踪脊柱关节==>如果它被跟踪,那么将其坐标保存到列表中(我简化了Y轴上的工作以简化)

  • 选择保存坐标的时间

  • 增加framecounter(最初等于零)

  • 如果帧计数器是> 1计算速度(x2 - x1)/(T2 - T1)并保存

这是一段代码:

System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
double msNow;
double msPast;
double diff;
TimeSpan currentTime;
TimeSpan lastTime = new TimeSpan(0);
List<double> Sylist = new List<double>();
private int framecounter = 0;

private void KinectSensorOnAllFramesReady(object sender, AllFramesReadyEventArgs allFramesReadyEventArgs)
    {
Skeleton first = GetFirstSkeleton(allFramesReadyEventArgs);


        if (first == null) // if there is no skeleton
        {
            txtP.Text = "No person detected"; // (Idle mode)
            return;
        }

        else
        {
            txtP.Text = "A person is detected";
            skeletonDetected = true;

            /// look if the person is totally detected



                find_coordinates(first);

                 /*******************************
                 * time computing *
                 /*******************************/

                currentTime = stopWatch.Elapsed;
                msNow = currentTime.Seconds * 1000 + currentTime.Milliseconds;
                if (lastTime.Ticks != 0)
                {
                    msPast = lastTime.Seconds * 1000 + lastTime.Milliseconds;
                    diff = msNow - msPast;
                }
                lastTime = currentTime;



        }


        //framecounter++;
    }
void find_coordinates(Skeleton first)
{
        //*modification 07052014 *****/

    Joint Spine = first.Joints[JointType.Spine];
    if  (Spine.TrackingState == JointTrackingState.Tracked)
    {

        double Sy = Spine.Position.Y;
     /*******************************
      * time starting *
     /*******************************/
        stopWatch.Start();

        Sylist.Add(Sy);
        framecounter++;
       }

        else
            return;

        if (framecounter > 1)
        {

            double delta_Distance = Sylist[Sylist.Count] - Sylist[Sylist.Count - 1];


        }


}

是最诚实的,我真的不知道在这种情况下如何使用时间跨度和秒表(我的意思是当有帧可以处理多次/秒时)

我会感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

第一: SkeletonFrame有一个名为Timespamp的属性,您可以使用它。使用那个比创建自己的时间系统更好,因为时间戳是由Kinect直接生成的。

第二: 跟踪上一个时间戳和位置。 那么这只是一个计算问题。

(CurrentLocation - PreviousLocation)=距离差

(CurrentTimestamp - PreviousTimestamp)=距离传播的时间。

例如,每33毫秒会得到0.1米。 所以你可以得到每秒的米数=(1秒/旅行时间)*距离差。在这个例子中,这是=(1000/33)* 0.1 = 3.03米/秒。