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

C++ C++;代码:查找Kinect传感器时出现逻辑错误,c++,visual-studio,kinect-sdk,kinect-v2,C++,Visual Studio,Kinect Sdk,Kinect V2,我想在ViualStudio 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 in

我想在ViualStudio 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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
常数int宽度=512;
const int height=424;
const int colorwidth=1920;
常数int colorheight=1080;
//Kinect变量
IKinectSensor*传感器;//Kinect传感器
IMultiSourceFrameReader*读卡器;//Kinect数据源
i坐标映射器*映射器;
int main(int argc,char*argv[]){
如果(失败(GetDefaultKinectSensor(&sensor))){
printf(“未找到传感器”);
getchar();
返回-100;
}
中频(传感器){
传感器->获取坐标映射器(&mapper);
传感器->打开();
传感器->OpenMultiSourceFrameReader(
FrameSourceTypes::FrameSourceTypes_深度| FrameSourceTypes::FrameSourceTypes_颜色,
&读者);
IMultiSourceFrame*帧源;

cout否,由于SDK v2,即使没有物理kinect连接到系统,您也可以使用kinect Studio调试应用程序。如果要检查实际kinect是否已连接,您需要使用传感器本身的
IsAvailable
属性。
GetDefaultKinect sensor
将始终为您提供
S_OK
unless您有运行时或安装问题。
GetDefaultKinect传感器
不会检查此流是来自实际的物理kinect传感器还是来自kinect Studio

以下是我的项目的代码片段。如果您想要更多关于Kinect的示例,请参考我在github中的项目或在此处发表评论。我非常乐意帮助您

 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;
    }
HRESULT CDepthBasics::InitializedFaultSensor()
{
HRESULT-hr;
hr=GetDefaultKinectSensor(&m_传感器);
如果(失败(小时))
{
返回人力资源;
}
中频(万用表传感器)
{
如果(成功(hr))
{
hr=m_传感器->获取协调映射(&m_pCoordinateMapper);
}
如果(成功(hr))
{
hr=m_传感器->打开();
}
如果(成功(hr))
{
hr=m_传感器->OpenMultiSourceFrameReader(
FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color | FrameSourceTypes::FrameSourceTypes_Body索引,
&MpmuMultisourceFrameReader);
}
}
如果(!m| | |传感器故障(hr))
{

std::cout如果找不到默认的Kinect传感器,它会将传感器设置为NULL吗?如果没有,可能尝试将传感器初始化为NULL。可能它没有成功找到传感器,也没有设置传感器指针?我对Kinect编程知之甚少,所以我可能错了。:)在您的github上,我看到您将m_pKinectSensor初始化为NULL.Since在您的项目中,导致GetDefaultKinectSensor的代码看起来大致相同,我认为是未初始化的指针导致了@masoomi的问题。@DavidVereb请检查编辑,我在那里添加了您的困惑的答案。感谢您提供的额外信息!我试图在您的github项目中找到可用的
但未被禁用如果
GetDefaultKinectSensor
总是在
S_OK
上返回一个好的传感器指针(无论是指向真正的kinect设备还是KinectStudio仿真设备),为什么还要检查
If(m_传感器)
?此外,阅读后,似乎“COM\u Outptr\u”注释可以保证指针在出现故障时被设置为NULL,因此忘记初始化为NULL肯定不是问题。如果您想要开源,请查看OPENNI。它是Kinect SDK的核心。OPENNI是由一家以色列公司开发的。Microsoft使用OPENNI在那里构建SDK后来,苹果公司带来了整个公司并关闭了OPENNI开源项目。但你仍然可以找到OPENNI。我自己保存了一份副本,因为它非常有用。所有骨架跟踪算法和更多的算法都在那里实现,它们是Kinect官方SDK和苹果Structure Sensor SDK的基础。