我试图将每个关节位置(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次的速度运行。因此,在帧读取功能中尽可能少地使用。
设置一个定时器或一个单独的线程,该线程将写入您的文件并只执行一次创建目录,因为现在它正在每帧创建一次。在帧读取器中,通过队列将skeletoData保存到对象。然后,您可以让定时器/线程简单地采用FIFO方法,以与数据相同的顺序写入数据。
我也会将任何foreach改为for循环,因为它更有效。