KinectReplay 类的 SkeletonFrameReady 事件处理程序未执行
本文关键字:执行 程序 事件处理 类的 SkeletonFrameReady KinectReplay | 更新日期: 2023-09-27 18:30:23
我正在按照 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();
}
由于 Kinect 工具箱是开源的,因此我们可以看到内部发生的事情。
当您通过向 KinectReplay 对象传递流来初始化该对象时,该类将查找该文件并查看哪些流已保存到该文件中(这是您在使用 KinectRecorder 并向其传递 KinectRecorderOptions 枚举实例时指定的)。然后,KinectReplay 构造函数将读取整个文件,在找到框架时将框架/颜色/深度帧添加到内部集合。
当您调用 Start 方法时,KinectReplay 系统将模拟录制到毫秒,提供与最初录制的帧计时相同的帧计时。例如,查看 ReplaySystem Start 方法,您将看到(在后台线程* - read:如果它是最后一个处于活动状态的线程,则不会保持进程运行)它会在第一帧中的时间戳执行线程休眠。就我而言,第一个骨架框架在 2752 毫秒内没有出现,所以这是第一次睡眠。可能是您的代码在重播系统唤醒并发出帧之前超出了范围。
*注意:它可能不是后台线程,从技术上讲,它是一个抽象的任务,可以选择任何并行机制。