Kinect 2 - AcquireLatestFrame()大部分时间都失败了

时间:2016-09-04 20:36:14

标签: c++ kinect frame-rate kinect-sdk kinect-v2

给出以下C ++代码,该代码从Kinect 2连续提取最新帧。

int main()
{
    setupKinect();
    acquireFrames();  
    return 0;
}

template<class Interface>
inline static void safeRelease(Interface *&interfaceToRelease)
{
    if (interfaceToRelease != nullptr) {
        interfaceToRelease->Release();
        interfaceToRelease = nullptr;
    }
}

void acquireFrames() {
    while (true) {
        if (bodyFrameReader != nullptr) {
            IBodyFrame* bodyFrame = nullptr;
            HRESULT hr = bodyFrameReader->AcquireLatestFrame(&bodyFrame);
            if (SUCCEEDED(hr)) {
                // processing bodyFrame 
            } else {    
                // acquiring frame failed   
            }
            safeRelease(bodyFrame);
        }
    }
}

void setupKinect() {
    IKinectSensor * sensor = nullptr;
    HRESULT hr = GetDefaultKinectSensor(&sensor);
    if (SUCCEEDED(hr)) {
        hr = sensor->Open();
        if (SUCCEEDED(hr)) {
            IBodyFrameSource* bodyFrameSource = nullptr;
            hr = sensor->get_BodyFrameSource(&bodyFrameSource);
            if (SUCCEEDED(hr)) {
                hr = bodyFrameSource->OpenReader(&bodyFrameReader);

            }
            safeRelease(bodyFrameSource);
        }
    }
    safeRelease(sensor);
}

为什么AcquireLatestFrame最常返回失败的HRESULT?一些测试表明,该功能每秒只能成功约30次,因此看起来这个功能最多只能获取/返回一个帧(Kinect帧速率为30 fps)。这是正确的吗?

1 个答案:

答案 0 :(得分:1)

是的,你是对的。

来源:请参阅下表中“深度感应”下的“30hz”:(您可能需要向下滚动一下)

  

https://developer.microsoft.com/en-us/windows/kinect/hardware

该功能的文档说:

  

返回值

     

输入:HRESULT

     

如果成功则返回S_OK;否则,返回失败代码。

(来源:https://msdn.microsoft.com/en-us/library/microsoft.kinect.kinect.ibodyframereader.acquirelatestframe.aspx

大部分时间返回的失败HRESULT代码是E_PENDING。这意味着新框架尚未准备好。

回答你的问题:为什么AcquireLatestFrame最常返回失败的HRESULT?

因为不需要多次处理相同的输入数据(通过一遍又一遍地计算相同的结果,你只会浪费你的CPU时间)。