我正在使用kinect工具包中的代码来记录和重放帧,我知道问题是它从不识别新的replay_SkeletonFrameReady,因此我无法绘制我记录的骨架。请注意,我读取的文件确实存在数据(通过kinect工具包方法保存的数据)。
void replay_SkeletonFrameReady(object sender, ReplaySkeletonFrameReadyEventArgs e)
{
//..The code never makes it to this part, why is this?
processFrame(e.SkeletonFrame);
}
private void processFrame(ReplaySkeletonFrame frame)
{
if (frame != null)
{
skeletonsReplay = new Skeleton[frame.Skeletons.Length];
skeletonsReplay = frame.Skeletons;
Console.WriteLine("attempting draw");
drawMe(); //..Function that draws skeleton
}
}
private void LaunchReplay()
{
Console.WriteLine("replay launched");
Stream readFS = File.OpenRead(@Global.localDirectory +
"\\localStorage\\MySwing.replay");
replay = new KinectReplay(readFS);
//..This line of code should cause the first function to be called right?
replay.SkeletonFrameReady += replay_SkeletonFrameReady;
replay.Start();
}
答案 0 :(得分:0)
由于Kinect Toolbox是开源的,我们可以看到内部发生的事情。
通过传递一个Stream来初始化KinectReplay对象时,该类将查找该文件,并查看哪些流已保存到文件中(这是在您使用KinectRecorder时指定的并且已通过它是一个KinectRecorderOptions枚举实例。KinectReplay构造函数将读取整个文件,在找到它们时将骨架/颜色/深度帧添加到内部集合。
当您调用Start方法时,KinectReplay系统将模拟录制到毫秒,提供与最初录制的帧时序相同的帧时序。例如,查看ReplaySystem Start方法,您将看到(在后台线程中* - 读取:如果最后一个线程处于活动状态,它将不会保持您的进程运行)它会为第一个时间戳执行线程休眠帧。在我的情况下,第一个骨架框架没有看到2752毫秒,所以这是第一次睡眠。在重放系统唤醒并发送帧之前,您的代码可能超出范围。
*注意:它可能不是后台线程,从技术上讲它是一个可以选择任何并行机制的抽象任务。