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

4

Решение

Да ты прав.

Источник: см. «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?

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]