我在这个问题上一直在堆叠,我真的很感激,如果有人可以帮助我。
我在许多论坛上多次问过,我搜索了很多,但没有回答真的帮助了我。
我正在开发一个应用程序,我必须使用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];
}
}
是最诚实的,我真的不知道在这种情况下如何使用时间跨度和秒表(我的意思是当有帧可以处理多次/秒时)
我会感谢您的帮助!
答案 0 :(得分:0)
第一: SkeletonFrame有一个名为Timespamp的属性,您可以使用它。使用那个比创建自己的时间系统更好,因为时间戳是由Kinect直接生成的。
第二: 跟踪上一个时间戳和位置。 那么这只是一个计算问题。
(CurrentLocation - PreviousLocation)=距离差
(CurrentTimestamp - PreviousTimestamp)=距离传播的时间。
例如,每33毫秒会得到0.1米。 所以你可以得到每秒的米数=(1秒/旅行时间)*距离差。在这个例子中,这是=(1000/33)* 0.1 = 3.03米/秒。