我试图将每个关节位置(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倍的速度运行一秒。因此,尽量减少帧读取功能。
设置一个计时器或一个单独的线程,将其写入文件并仅创建一次创建目录,因为现在它每帧创建一次。
在帧读取器中,通过队列将skatelineData保存到对象。然后,您可以让计时器/线程简单地采用FIFO方法,以相同的顺序写入数据。
我还会将任何foreach更改为for循环,因为它有点more efficient 。
关于c# - Kinect:在AllFramesReadyEventArgs内部具有循环功能的粗帧显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36640210/