Ниже приведен код 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 кадров в секунду). Это правильно?
Да ты прав.
Источник: см. «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?
Потому что нет необходимости обрабатывать одни и те же входные данные более одного раза (вы просто потратите время своего ЦП, вычисляя одни и те же результаты снова и снова).
Других решений пока нет …