2016-05-03 25 views
1

Kinect 2.0 SDKのデプスセンサーを活用したいと思いますが、このデータは画像の形式で表示されるのではなく、整数または同様のもので表示されるという意味ではありません。その例は、私がKinectに非常に近いところに手を持っていれば、私はカメラと障害物の間の範囲を概ね示す整数値を得るでしょう。 のようなものかもしれません。障害物が動くにつれて、Kinectは距離を再計算し、秒または半秒ごとに更新します。Kinect 2.0から深度データを距離値に変換する方法は?

The distance between the kinect and the obstacle is 20 cm 
The distance between the kinect and the obstacle is 10 cm 
The distance between the kinect and the obstacle is 100 cm 

これは可能ですか? 私はチュートリアルを検索しましたが、表現は通常、ポイントクラウドまたは白黒の奥行き画像を使用しています。

+0

あります。この情報があなたの目的には不十分である理由を説明できますか? – Angew

+0

私は、そのデータを画像データからkinectからの距離だけに移動する方法を知りませんでした。チュートリアルやサンプルコードは参考になります。ありがとう – user1680944

+1

チュートリアルをお勧めするのは(主な)SOの話題です。何かを見つけてそれに続いて遭遇する可能性のある問題を調査し、解決されていない場合は特定の質問に戻ってみるべきです。関連するチャットでチュートリアルのポインタなどを尋ねることができるかもしれませんが、わかりません。あなたは、ポイントクラウド/深度画像を意味のあるスーゼン表現に変換するための画像処理またはコンピュータビジョンを調べることができます。 – Angew

答えて

2

は、この質問がいくつかの時間前に頼まれており、最も可能性の高い問う人は自分のことで、これを解決したとしても、私はちょうど同じ問題/質問この問題を解決するためのC++のコードを持っているかもしれない皆を与えたかったです。

注:この溶液のKinect SDK 2.0に基づいており、私の記憶が正しければ、私はKinectの2.0 SDKに付属しているSDKブラウザ2.0で提供されている例の1からそれを取りました。私はすべての特別な修正を取り除き、最も重要な部分を残しました(したがって、おそらくvoidを修正して何らかのリターンパラメータを与える必要があります)。初期化として

m_pDepthFrameReader「は黒と白の奥行き画像」は、おそらくあなたのオンラインショップと画素の明度としてエンコード他のオブジェクトとの間の距離を与えるIDepthFrameReader*

void KinectFusionProcessor::getDistance() { 
IDepthFrame* frame = NULL; 
if (SUCCEEDED(m_pDepthFrameReader->AcquireLatestFrame(&frame))) { 
    int width = 512; 
    int height = 424; 
    unsigned int sz=(512*424); 
    unsigned short buf[525 * 424] = {0}; 
    frame->CopyFrameDataToArray(sz,buf); 

    const unsigned short* curr = (const unsigned short*)buf; 
    const unsigned short* dataEnd = curr + (width*height); 

    while (curr < dataEnd) { 
     // Get depth in millimeters 
     unsigned short depth = (*curr++); 
    } 
} 
if (frame) frame->Release(); 
} 
1

これはかなり簡単です。 C++の正確なコードはわかりませんが、C#では深度フレームがあると、次のことを行う必要があります。 深度値を評価する場所をYとXが指すことを既に知っているとします。

これがわかったら、最初に深さフレームの各バイトをushortに変換する必要があります。

その後、XポイントとYポイントに対応するdepthPixels内のインデックスを計算する必要があります。通常、これは使用される方程式です:

// Get the depth for this pixel 
ushort depth = frameData[y * depthFrameDescription.Height + x]; 

私はこれが役に立ちそうです。

+0

私は間違っていないと実際には(y *幅)+ xと信じています。 –

2

Kinectは実際に点群を使用します。ポイントクラウドの各ピクセルには、Kinectからの距離(mm)を表す符号なしの短い整数値があります。私は、カメラがすでに補償していること、またはビューの側面にあるオブジェクトが離れていることを前から知っているので、すべてのデータは、Kinectカメラが見ている平面から離れたオブジェクトの奥行きを表しています。 Kinectは約8mまで見ることができますが、信頼性の高いデータは4〜5mしかありません。0.5mより近いものは見えません。 それはあなたが障害物検知システムとしてそれを使用するように聞こえるので、私は、点群内のすべてのデータポイントを監視し、他から離れて立つと離れておおよその距離で、独自のオブジェクトとして、それらを解釈するグループ化されたデータポイントを平均ことをお勧めしたいです。また、Kinectは毎秒30フレーム(ハードウェアが集中的なデータストリームを処理できると仮定して)で更新します。したがって、距離を変化させるオブジェクトのために点群を常に監視しているだけです。

SDKとKinect Studioの両方をダウンロードする場合は、深さ/ IRプログラミングの例とスタジオを使用して、データの使用方法を理解することができます。

関連する問題