2016-09-04 10 views
4

Следующий код C++ дается непрерывно извлекает последний кадр из Kinect 2.Kinect 2 - AcquireLatestFrame() не большую часть времени

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?

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