0

我正在遵循 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();
    }
4

1 回答 1

0

由于Kinect 工具箱是开源的,我们可以看到内部发生的情况。

当您通过传递一个 Stream 来初始化KinectReplay对象时,该类将查看该文件并查看哪些流已保存到文件中(这是在您使用KinectRecorder并传递给它一个KinectRecorderOptions枚举实例时指定的。然后KinectReplay构造函数将读取整个文件,在找到它们时将骨架/颜色/深度帧添加到内部集合。

当您调用 Start 方法时,KinectReplay 系统将模拟录制到毫秒,提供与最初录制的相同帧计时。例如,查看ReplaySystem Start 方法,您会看到(在后台线程中* - 阅读:如果最后一个线程处于活动状态,则不会让您的进程继续运行)它为第一帧中的时间戳执行线程睡眠。在我的情况下,第一个骨架帧在 2752 毫秒内没有看到,所以这是第一次睡眠。在重播系统唤醒并发送帧之前,您的代码可能超出范围。

*注意:它可能不是后台线程,它在技术上是一个可以选择任何并行机制的抽象任务。

于 2014-03-15T04:27:02.980 回答