我试图将每个关节位置 (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秒滞后一次(骨骼移动,而不是帧率)。
知道如何解决这个问题吗?谢谢你们。
我在处理深度数据时遇到了类似的问题。首先要注意的是 Kinect 在 GPU 上是一个费力的设备,帧更新是它的核心,所以你必须小心使用任何耗时的任务,因为它们将在每个帧速率或大约 30 次运行一秒。因此尽可能少地放入帧读取函数。
设置一个计时器或一个单独的线程来写入您的文件并只创建一次目录,因为现在它每帧都在创建它。在框架阅读器中,通过队列将骨架数据保存到对象中。然后,您可以让计时器/线程简单地采用 FIFO 方法,按照数据出现的相同顺序写入数据。
我也会将任何 foreach 更改为 for 循环,因为它有点 more efficient .
我是一名优秀的程序员,十分优秀!