Kinect 2 - AcquireLatestFrame() терпит неудачу большую часть времени

Ниже приведен код 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 кадров в секунду). Это правильно?

1 ответ

Решение

Да ты прав.

Источник: см. "30 Гц" в разделе "Измерение глубины" в таблице здесь: (возможно, вам придется немного прокрутить вниз)

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?

Потому что нет необходимости обрабатывать одни и те же входные данные более одного раза (вы просто потратите время своего ЦП, вычисляя одни и те же результаты снова и снова).

Другие вопросы по тегам