Kinect 2——AcquireLatestFrame()大部分时间失败

4
给出了以下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个回答

1

是的,你说得对。

来源:在这里的表格中,在“深度感应”下看到“30hz”:(您可能需要向下滚动一点)

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

该函数的文档说明如下:
返回值
类型: HRESULT
如果成功返回S_OK;否则,返回一个失败代码。
(来源:https://msdn.microsoft.com/zh-cn/library/microsoft.kinect.kinect.ibodyframereader.acquirelatestframe.aspx
它通常返回的失败HRESULT代码是E_PENDING。这意味着新帧尚未准备好。
为了回答你的问题:为什么AcquireLatestFrame通常会返回失败的HRESULT?
因为没有必要处理相同的输入数据多次(这样做只会浪费CPU时间,反复计算相同的结果)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接