2017-07-07 10 views
-1

を見つけることに、私はViual Studioの2013年にWindowsのSDK 2.0でのKinect V2からの深さとRGBデータを取得したいので、私はこれらのコードを記述します。C++コード:論理エラーのKinectセンサー

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

論理的には、I私のラップトップにKinectセンサーを接続しないでください。コンソールに "not found sensor"と表示されますか?しかし、コンソールでは、「Find !!!」と表示されます。何が問題ですか?

+0

デフォルトのKinectセンサーが見つからない場合は、sensorをNULLに設定しますか?そうでない場合は、センサーをNULLに初期化してみてください。たぶんセンサーが見つかりませんでしたが、センサーポインターを設定していませんでしたか?私はKinectのプログラミングについてよく知らないので、間違っているかもしれません。 :) –

答えて

1

いいえ、SDK v2以降、物理的なkinectがシステムに接続されていなくても、KinectStudioを使用してアプリケーションをデバッグすることができます。実際の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は私と一緒ではありません。私はGetDefaultKinectSensorS_OKを返すと言いました。ランタイムやインストールの問題がない限り、私はGetDefaultKinectSensorは常にm_pKinectSensorを与えてくれると言っていませんでした。 GetDefaultKinectSensorの実装にアクセスすることはできませんので、使用する前にnullかどうかを確認することをお勧めします。 This is the official answer for your question from the Microsoft

+0

あなたのgithubで、私はNULLにm_pKinectSensorを初期化することがわかります。あなたのプロジェクトのGetDefaultKinectSensorにつながるコードは同じように見えるので、私はそれが@ masoomiの問題の原因となる初期化されていないポインタだと思っています。 –

+1

@DavidVereb編集を確認してください。あなたの混乱の答えを追加しました。 –

+0

追加情報をありがとう!あなたのgithubプロジェクトで 'IsAvailable'を見つけようとしましたが、見つけられませんでした。私はまだ興味があります。もし 'GetDefaultKinectSensor'が常に' S_OK'(実際のキネクトデバイスかエミュレートされたデバイスを指しているかどうかに関わらず)に良いセンサーポインタを返すなら、なぜ 'if(m_pKinectSensor)'チェックをしていますか? –