我尝试将每个关节位置(xyz)保存到一个文本文件中。下面是代码的一部分:
private void KinectAllFramesReady(object sender, AllFramesReadyEventArgs)
{
.
.
.
//Some initialization code//
.
.
.
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame != null)
{
if ((this.skeletonData == null) || (this.skeletonData.Length != skeletonFrame.SkeletonArrayLength))
{
this.skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength];
}
skeletonFrame.CopySkeletonDataTo(this.skeletonData);
haveSkeletonData = true;
//===============
foreach (var skeleton in skeletonData)
{
if (skeletonFrame != null)
{
if (skeleton.TrackingState == SkeletonTrackingState.Tracked)
{
// check the record check box
//if (obj.RecCheckStat == true)
if (RecordCheckBox.IsChecked == true)
{
//save skeleton to string
Directory.CreateDirectory(folder_path);
File.WriteAllText(file_path, currentSkeleton);
}
}
}
}
//===============
}
}
}
.
.
.
//Draw skeleton-depth-color//
.
.
.
}似乎在foreach (var skeleton in skeletonData)函数中,帧将每4-5秒滞后一次(骨架移动,而不是帧速率)。
你知道怎么解决这个问题吗?谢谢你们。
发布于 2016-04-26 22:56:00
我在处理深度数据时也遇到过类似的问题。首先要注意的是,Kinect在GPU上是一个费力的设备,帧更新是它的核心,所以你必须小心使用任何耗时的任务,因为它们将以每帧速率或每秒30次的速度运行。所以尽量少放在帧读取函数中。
设置一个计时器或一个单独的线程,它将写入您的文件,并只创建目录一次,因为现在它正在创建它的每一帧。在帧阅读器中,通过队列将skeletonData保存到对象。然后,您可以让计时器/线程简单地采用FIFO方法,以相同的顺序写入数据。
我还会将任何foreach改为for循环,因为它是一个小more efficient 。
https://stackoverflow.com/questions/36640210
复制相似问题