1

问候,

我正在使用 Kinect 360 在 C++ 中开发一个应用程序。我在运行时遇到了 KinectGrabber 的问题,它没有像我希望的那样在运行时初始化相机。在调试它时,我发现它在测试“hr”的值时出现“MSFTKinectGrabber::Init”错误。这个测试尽职尽责地中断了程序,但我不知道为什么。

我的设置:

  • 我已经安装了 Kinect v1.8 SDK,然后是 v1.8 Development Kit,最后是 v1.8 Runtime。
  • 编译器是VStudio 2010;
  • 这个应用程序是由我的一位同事开发的,之前在另一台计算机上运行过(笔记本电脑 - windows 8);
  • 我正在使用新桌面(Windows 10);
  • 尝试了多个 USB 条目(2.0 和 3.0),Kinect 正在“Developer Toolkit Browser v1.8.0(kinect for Windows)的演示中工作;
  • 在设备管理器中检查 Kinect 的驱动程序并更新它们(无论哪种方式,Kinect 运行时都会添加额外的驱动程序功能并更新它们);

当程序进入 IF 语句 (@"MSFTKinectGrabber::Init") 时,这似乎是一切都出错的地方:

    hr = m_NuiSensor->NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480,
                            depthFlags, 2, m_NextDepthFrameEvent, &m_pDepthStreamHandle);
    if( FAILED( hr ) )
    {
        std::cout << "Error: NuiImageStreamOpen " <<  hr << std::endl;
        return false;
    }

下面我有关于:

  • 我的main,而不是我认为的问题的核心,只是为了展示我如何启动程序;
  • 我的函数“ initializeKinect ”,如果“MSFTKinectGrabber::Init”返回 true,则 if(!grabberMSFT.Init(&processor)) 语句应该为 false,这意味着没有问题;
  • 函数“ MSFTKinectGrabber::Init ”,用于 Kinect 的初始化和测试。

功能:主要

int main(int argc, char** argv){
    processor = new KinectDataProcessor();
    MSFTKinectGrabber grabberMSFT;

    int kinect_state = initializeKinect(*processor, grabberMSFT, argc, argv);

    if(kinect_state==0){
        cloudProcessor = new CloudProcessor();
        int v=0;
        while (run){
            v++;
            HandleKeyboardEvents();
            processor->Update(); 
            if (startClassify && !continueClassify){
                continueClassify = true;
                boost::thread classificationThread(&threadClassify);
            }
        }
        grabberMSFT.DeInit();   
        processor->DeInit();
    }else{
        system("PAUSE");
        return -1;
    }

    return 0;
}

功能:初始化Kinect

int initializeKinect(KinectDataProcessor & processor, MSFTKinectGrabber & grabberMSFT, int argc,char** argv){
    int nRetCode = 0;

    if (hModule != NULL)
    {
        // initialize MFC and print and error on failure
        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        {
            // TODO: change error code to suit your needs
            _tprintf(_T("Fatal Error: MFC initialization failed\n"));
            nRetCode = 1;
        }
        else
        {

            std::cout << "Kinect Parameters: " << std::endl;
            std::cout << "1 - MinDepth (float)  - minimum allowed is '0.0f'" << std::endl;
            std::cout << "2 - MaxDepth (float)  - maximum allowed is '4.0f'" << std::endl;
            std::cout << "3 - NearMode (int)    - '0' for true, '1' for false" << std::endl;

            float minDepth = MIN_DEPTH;//float (atof(argv[1]));
            float maxDepth = MAX_DEPTH;//float (atof(argv[2]));

            std::cout << "[MinDepth, MaxDepth] = [" << minDepth << ", " << maxDepth << "]" << std::endl;

            bool nearModeActive = true;
            std::cout << "Near mode selected\n";

            //KinectDataProcessor processor;
            if(!processor.Init(KinectProcessor::GrabberType::MSFT))
            {
                processor.DeInit();
                run = false;
                return -1;
            }


            processor.SetDepthParameters(minDepth, maxDepth, nearModeActive);

            //MSFTKinectGrabber grabberMSFT;

            if (!grabberMSFT.Init(&processor)){
                    grabberMSFT.DeInit();
                    processor.DeInit();
                    run = false;

                    return -1;
            }

            cout<<"Ready to run"<<endl;
        }
    }
    else
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
        nRetCode = 1;
    }

    return nRetCode;

}

功能:MSFTKinectGrabber::Init

bool MSFTKinectGrabber::Init(KinectProcessor * kinectProcessor)
{
    m_KinectProcessor = kinectProcessor;

    //get NuiSensor obj
    HRESULT hr = NuiCreateSensorByIndex(0, &m_NuiSensor);
    if ( FAILED(hr) )
    {
        std::cout << "Error: NuiCreateSensorByIndex " << hr << std::endl;
        return false;
    }

    m_DeviceID = m_NuiSensor->NuiDeviceConnectionId();

    hr = m_NuiSensor->NuiInitialize( NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH );
    if( FAILED(hr) )
    {
        std::cout << "Error: NuiInitialize " << hr << std::endl;
        return false;
    }

    //Create color and depth events
    m_NextColorFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    m_NextDepthFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

    //open video streams
    hr = m_NuiSensor->NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, 0, 2, m_NextColorFrameEvent, &m_pColorStreamHandle);
    if( FAILED( hr ) )
    {
        std::cout << "Error: NuiImageStreamOpen " <<  hr << std::endl;
        return false;
    }

    DWORD depthFlags = NULL;
    if(kinectProcessor->IsMSFTNearMode())
        depthFlags = NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE;

    hr = m_NuiSensor->NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480, depthFlags, 2, m_NextDepthFrameEvent, &m_pDepthStreamHandle);
    if( FAILED( hr ) )
    {
        std::cout << "Error: NuiImageStreamOpen " <<  hr << std::endl;
        return false;
    }

    // Start the NUI processing thread
    m_ProcessThreadStopEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
    m_ProcessThread = CreateThread( NULL, 0, ProcessThread, this, 0, NULL );

    return true;
}

感谢您的时间!

4

1 回答 1

0

快速回答:

如果您的 Kinect 正面写有“XBOX360”,则您无法使用 Near 模式,您需要将 nearModeActive 从 true 更改为 false。


更多细节:

我相信问题在于您正在尝试将 Near 模式与常规 Kinect 一起使用。在您的 initializeKinect 中,以下内容是硬编码的:

bool nearModeActive = true;
std::cout << "Near mode selected\n";

接着

processor.SetDepthParameters(minDepth, maxDepth, nearModeActive);

MSFTKinectGrabber::Init 然后尝试以近模式打开深度流,原因如下:

if(kinectProcessor->IsMSFTNearMode())
    depthFlags = NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE;

问题是:普通的 XBOX Kinect 不支持这个功能。只有适用于 Windows 的 Kinect 可以。事实上,这是他们之间唯一真正的区别。适用于 Windows 的 Kinect 要贵得多您可以在此处阅读有关近距离模式的更多信息。

于 2016-10-12T18:08:05.730 回答