Kinect 2 - AcquireLatestFrame() 大部分时间都失败
Kinect 2 - AcquireLatestFrame() fails most of the time
给出了以下 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
通常 returns 失败的 HRESULT?一些测试显示该功能每秒仅成功约30次,因此似乎某个帧最多acquired/returned一次被该功能(Kinect帧率为30 fps)。这是正确的吗?
是的,你是对的。
来源:请参阅 table 中“深度感应”下的“30hz”:(您可能需要向下滚动一点)
https://developer.microsoft.com/en-us/windows/kinect/hardware
该函数的文档说:
Return value
Type: HRESULT
Returns S_OK if successful; otherwise, returns a failure code.
大多数时候 returns 的失败 HRESULT 代码是 E_PENDING。这意味着新的框架还没有准备好。
回答您的问题:为什么 AcquireLatestFrame 通常 returns 失败的 HRESULT?
因为不需要多次处理相同的输入数据(您只会通过一遍又一遍地计算相同的结果来浪费 CPU 时间)。
给出了以下 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
通常 returns 失败的 HRESULT?一些测试显示该功能每秒仅成功约30次,因此似乎某个帧最多acquired/returned一次被该功能(Kinect帧率为30 fps)。这是正确的吗?
是的,你是对的。
来源:请参阅 table 中“深度感应”下的“30hz”:(您可能需要向下滚动一点)
https://developer.microsoft.com/en-us/windows/kinect/hardware
该函数的文档说:
Return value
Type: HRESULT
Returns S_OK if successful; otherwise, returns a failure code.
大多数时候 returns 的失败 HRESULT 代码是 E_PENDING。这意味着新的框架还没有准备好。
回答您的问题:为什么 AcquireLatestFrame 通常 returns 失败的 HRESULT?
因为不需要多次处理相同的输入数据(您只会通过一遍又一遍地计算相同的结果来浪费 CPU 时间)。