次の 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 が返されるのはなぜですか? 一部のテストでは、関数が 1 秒間に約 30 回しか成功しないことが明らかになったため、この関数によって特定のフレームが取得/返されるのは多くても 1 回と思われます (Kinect フレームレートは 30 fps です)。これは正しいですか?