Kinect v2如何知道帧是否排队

时间:2016-02-18 15:59:35

标签: c# multithreading events kinect kinect-sdk

我正在用kinect v2.0相机做一些复杂的机器人视觉。 有时我的重型优化数学需要比33ms长一点。 (取决于相机前面的内容)

与30帧/秒一样,我的数学需要很快,而且速度非常快。 然而有时它仍然不够快,我得到几毫秒。 然后是接缝,帧会排队。

据我所知,这是一行如

depthFrameReader.FrameArrived += DepthFrameReader_FrameArrived

在新帧到达时创建事件,这些事件可以排队。 好吧,我认为这些事件是在parralel中执行的(至少在我认为的另一个线程中)。当我使用visual studio 2015调试模式时,我有时会发现这些线程需要的时间比它们要长一些。当发生这种情况时,所有人都可能排队等候。就像堵车一样。

由以下定义的框架:

private void DepthFrameReader_FrameArrived(object sender, DepthFrameArrivedEventArgs e)
    { // an in between function maybe to detect queue somehow..

       doDepthMath(e);
    }

    private void doDepthMath(DepthFrameArrivedEventArgs e)
    {
        var frameReference = e.FrameReference;
        {
            var frame = frameReference.AcquireFrame();

有一个名为frame.RelativeTime() ...

的属性

是否可以用来检查框架是否确实是在短于33毫秒的间隔内创建的? ..但不会总是这样吗?

从本质上讲,如果我的数学仍然很忙,我正在寻找一种简单丢帧的方法,但我不知道如何知道这一点,因为从我对此的理解来看,一个事件没有&#39 ;了解其他触发事件。

也许使用inbetween函数我可以检查计算是否准备好了? 但是我不确定如何知道这些事件是否通过代码排队,而不是在vs2015的调试视图之外。

1 个答案:

答案 0 :(得分:1)

为什么不使用标志来表示你的数学计算是否已经完成?

private bool flagDoingMath = false;

private void DepthFrameReader_FrameArrived(object sender, DepthFrameArrivedEventArgs e)
{
    if(flagDoingMath) return;

    flagDoingMath = true;

    doDepthMath(e);

    flagDoingMath = false;
}