C++ 代码:查找 Kinect 传感器时出现逻辑错误

C++ code: Logical error in finding the Kinect sensor

我想在 Viual Studio 2013 中通过 Windows SDK 2.0 从 Kinect V2 获取深度和 RGB 数据。所以我写了这些代码:

#include <Kinect.h>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
#include <iostream>
using namespace std;

const int width = 512;
const int height = 424;
const int colorwidth = 1920;
const int colorheight = 1080;

// Kinect Variables
IKinectSensor* sensor;             // Kinect sensor
IMultiSourceFrameReader* reader;   // Kinect data source
ICoordinateMapper* mapper;
int main(int argc, char* argv[]) {

if (FAILED(GetDefaultKinectSensor(&sensor))) {
    printf("not found sensor");
    getchar();
    return -100;
}
if (sensor) {
    sensor->get_CoordinateMapper(&mapper);

    sensor->Open();
    sensor->OpenMultiSourceFrameReader(
        FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color,
        &reader);
    IMultiSourceFrame* framesource;

    cout << "Find!!!";
    getchar();
    return 100;
}
else {
    return -100;
}
getchar();
return 10;
}

逻辑上,当我没有将 Kinect 传感器插入我的笔记本电脑时,控制台中应该打印:"not found sensor",不是吗?但是,在控制台打印:"Find!!!"。有什么问题?

不,从 SDK v2 开始,您可以使用 KinectStudio 调试应用程序,即使没有物理 kinect 连接到系统。如果要检查是否连接了实际的Kinect,则需要使用传感器本身的IsAvailable 属性。 GetDefaultKinectSensor 将始终为您提供 S_OK,除非您遇到运行时或安装问题。 GetDefaultKinectSensor 不会检查这个流是来自实际的物理 kinect 传感器还是来自 KinectStudio。

以下是我项目中的代码片段。如果你想要更多关于 Kinect 的例子,请参考我在 github https://github.com/shanilfernando/VRInteraction 中的项目或在这里评论。我非常乐意为您提供帮助。

 HRESULT CDepthBasics::InitializeDefaultSensor()
    {
        HRESULT hr;

        hr = GetDefaultKinectSensor(&m_pKinectSensor);
        if (FAILED(hr))
        {
            return hr;
        }

        if (m_pKinectSensor)
        {
            if (SUCCEEDED(hr))
            {
                hr = m_pKinectSensor->get_CoordinateMapper(&m_pCoordinateMapper);
            }
            if (SUCCEEDED(hr))
            {
                hr = m_pKinectSensor->Open();
            }

            if (SUCCEEDED(hr))
            {
                hr = m_pKinectSensor->OpenMultiSourceFrameReader(
                    FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color | FrameSourceTypes::FrameSourceTypes_Body | FrameSourceTypes::FrameSourceTypes_BodyIndex,
                    &m_pMultiSourceFrameReader);
            }


        }

        if (!m_pKinectSensor || FAILED(hr))
        {
            std::cout << "No ready Kinect found!" << std::endl;
            return E_FAIL;
        }
        else
        {
            std::cout << "Kinect found!" << std::endl;
        }

        return hr;
    }

https://github.com/shanilfernando/VRInteraction/blob/master/DepthBasics.cpp

编辑

我没有使用 IsAvailable,因为对我来说,流的来源并不重要。有时我使用 KinectStudio 来获取流,而 Kinect 不在身边。我说过 GetDefaultKinectSensor 会 return S_OK 除非你有运行时或安装问题,我没有说 GetDefaultKinectSensor 总是会给你一个有效的 m_pKinectSensor。由于我们无法访问 GetDefaultKinectSensor 的实现,作为一个好的做法,最好在使用它之前检查它是否 nullThis is the official answer for your question from the Microsoft