KinectReplay类的SkeletonFrameReady事件处理程序未执行

时间:2013-09-05 15:47:46

标签: c# kinect kinect-sdk kinect.toolbox

我正在使用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();
    }

1 个答案:

答案 0 :(得分:0)

由于Kinect Toolbox是开源的,我们可以看到内部发生的事情。

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

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

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

相关问题