【问题标题】:velocity of a joint between two frames using kinect sdk使用 kinect sdk 的两帧之间的关节速度
【发布时间】:2014-05-09 13:34:58
【问题描述】:

我在这个问题上很长时间了,如果有人可以帮助我,我将非常感激。

我在很多论坛上问过很多次,我已经搜索了很多但没有真正帮助我的答案。

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

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

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

如果不是真的,谢谢你澄清事情。

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

  • 检测人

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

  • 保存坐标时取时间

  • 增加帧计数器(初始为零)

  • 如果帧计数器 > 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];


        }


}

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

感谢您的帮助!

【问题讨论】:

  • 你有错误吗?你的问题到底是什么?

标签: kinect velocity frames


【解决方案1】:

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

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

(CurrentLocation - PreviousLocation) = 距离差

(CurrentTimestamp - PreviousTimestamp) = 行驶距离所用的时间。

例如,您将每 33 毫秒获得 0.1 米。 所以你可以像这样得到每秒米数=(1秒/旅行时间)*距离差。在示例中,这是 = (1000/33)*0.1 = 3.03 米/秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多