首页 > 技术文章 > Kinect2.0 MultiSourceFrameReader 的 AcquireLatestFrame 方法获取不到帧的解决方案

asmer-stone 2016-05-12 15:36 原文

先把大致要写的东西写一下,手里的活忙完了再完善。

 

在代码中使用下边的语句,获取Kinect中,colorFrame, depthFrame, bodyIndex三种帧,但是经常会遇到在后边的程序中处理三个帧之后,就无法再得到新的帧了。

hr = pMultiSourceFrameReader->AcquireLatestFrame(&pMultiSourceFrame);

原因大概是因为colorFrame太大了传输时间过长,或者是后续处理图片的时间过长,然后由于某些搞不懂的原因,在上边的代码中,hr的值总是:  E_PENDING The data necessary to complete this operation is not yet available.

这里,在上边这句代码中加入下边这段,可以解决此问题。

while (FAILED(hr))
    {
        SafeRelease(pMultiSourceFrame);
        SafeRelease(pMultiSourceFrameReader);
        hr = pMyKinect->OpenMultiSourceFrameReader(FrameSourceTypes::FrameSourceTypes_Depth |
            FrameSourceTypes::FrameSourceTypes_Color | FrameSourceTypes::FrameSourceTypes_BodyIndex,
            &pMultiSourceFrameReader);
        Sleep(60);
        if (SUCCEEDED(hr))
        {
            hr = pMultiSourceFrameReader->AcquireLatestFrame(&pMultiSourceFrame);
        }
        
        cout << "MultiSourceFrame" << rand() % 100 << endl;
    }

 

原理: 当获取不到帧时,先释放pMultiSourceFramepMultiSourceFrameReader 这两个资源,然后重新初始化,并获得帧。记得初始化之后,在读取帧的时候让程序Sleep一小段时间,不然由于时间太短,Kinect会反应不过来,仍然获取不到帧。

 

完整代码后续放出。

推荐阅读