2016-09-25 10 views
1

挨拶、開発:Kinectの問題「エラー:NuiImageStreamOpen -2097086449」

私は、カメラを初期化しませんKinectGrabberと、実行時に問題が生じていますKinectの360を使用してC++でアプリケーションを開発しています私は実行時に望みました。それをデバッグすると、 "hr"の値をテストするときに "MSFTKinectGrabber :: Init"にエラーが発生することがわかりました。このテストはプログラムを忠実に中断しますが、私はその理由を知りません。

マイセットアップ:

  • 私はKinectのV1.8 SDKののをインストールしている、そして開発キットをV1.8、最終的にランタイムをV1.8。
  • コンパイラはVStudio 2010です。
  • このアプリは、私の同僚によって開発され、前に別のコンピュータ(Laptop - windows 8)で実行されていました。
  • 私は新しいデスクトップ(Windows 10)を使用しています。
  • Kinectは、「Developer Toolkit Browser v1.8.0(kinect for Windows)」のデモで作業しています;
  • デバイスマネージャのKinectのドライバをチェックして更新しました、Kinectのランタイム)は、余分なドライバの機能を追加し、それらも更新します。

これは、プログラムが()「MSFTKinectGrabber ::初期化」@ IF文を入力したとき、すべてが間違っに行くように見える場所です。

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; 
    } 

私はに関する全体のコード持って下:私のメイン、ないと思い、問題の核心は、私はプログラムを起動する方法を示すためにjsut

  • を。
  • My機能 "initializeKinect"、どこif文 "MSFTKinectGrabber :: initは" 何の問題を意味していないこれ、真を返した場合はfalseでなければなりません(grabberMSFT.Init(&プロセッサ)!)。
  • 関数 "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; 
} 

機能:initializeKinect

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 ::初期

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; 
} 

ありがとうございました!

答えて

0

クイック答え:

あなたのKinectは、あなたが近くモードを使用することはできませんし、あなたがtrueからfalseにごnearModeActiveを変更する必要があるよりも、その前面に書かれた「XBOX360」を持っている場合。


詳細:

私は、問題はあなたが定期的に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; 

問題は次のとおりです。regular XBOX Kinectはこの機能をサポートしていません。 Kinect for Windowsのみが行います。実際、それがそれらの唯一の違いです。 Windows用のKinectはmuch more expensiveです。ニア・モードhereの詳細を読むことができます。

関連する問題