2012-06-13 7 views
5

SDKを使用してプログラムを作成しています。ユーザーが検出されたときに、プログラムはそのためのスケルトンを描画します。私は最近、私のXboxで宣伝ゲームを見Nike+ Kinect、それはのような何かをやって文字のコピーを表示する方法を説明しました:Kinect SDKを使用したBodyのポイントクラウド

http://www.swaggerseek.com/wp-content/uploads/2012/06/fcb69__xboxkinect1.jpg

それとも

http://www.swaggerseek.com/wp-content/uploads/2012/06/fcb69__xboxkinect.jpg

私はポイントを作成できます - 検出された人のみの大まかな表現(背景なし)?前もって感謝します! this siteを使用して


EDIT

、私はポイントクラウドを作成することができますが、それでも、人の体の周りにトリミングすることはできません。

答えて

5

完全な点群を表示しているのではなく、青色の陰影付きの輝度マップを表示しているように見えます。これは、Kinect for Windows sdkの深さイメージを使って行うことができます。 探しているのはプレーヤーのインデックスです。これは、奥行き画像の各ピクセルの提供ビットです。プレーヤーのインデックスビットを取得するには、初期化コードで骨格ストリームを有効にする必要があります。

これが私のやり方です。私はそれがhere負荷を見つけたのWindows SDKのクイックスタート用のKinectの1を変更し、次のように変更します午前:

//Change image type to BGRA32 
image1.Source = 
       BitmapSource.Create(depthFrame.Width, depthFrame.Height, 
       96, 96, PixelFormats.Bgra32, null, pixels, stride); 

     //hardcoded locations to Blue, Green, Red, Alpha (BGRA) index positions  
     const int BlueIndex = 0; 
     const int GreenIndex = 1; 
     const int RedIndex = 2; 
     const int AlphaIndex = 3; 

//get player and depth at pixel 
int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask; 
int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth; 

//check each pixel for player, if player is blue intensity. 

      if (player > 0) 
      { 
       pixels[colorIndex + BlueIndex] = 255; 
       pixels[colorIndex + GreenIndex] = intensity; 
       pixels[colorIndex + RedIndex] = intensity; 
       pixels[colorIndex + AlphaIndex] = 100; 

      } 
      else 
      { 
       //if not player make black and transparent 
       pixels[colorIndex + BlueIndex] = 000; 
       pixels[colorIndex + GreenIndex] = 000; 
       pixels[colorIndex + RedIndex] = 000; 
       pixels[colorIndex + AlphaIndex] = 0; 
      } 

それはまだ右の深さビューアを提供しますので、私は色をテストするために、この例を使って好き側。私は、この効果は、以下の実行のイメージ付着した:左

enter image description here

画像をわずかに着色した画素レベルの強度データを有する強度マップです。

あなたはポイントの非常に単純な三角測量を行うことができます デビッド・ベイツ

+2

ピクセルレベルのエフェクトについて考えた後です。他のすべてのピクセルで強度を増やすと、サンプル画像にその輝きの効果が現れることがあります。ちょうどスティーン:) – davidbates

+0

クール!どうもありがとう! –

2

これは公式のKinect SDKでは自動的には不可能です。しかし、それはOpenNIと呼ばれる代替SDKで実装されています。そこには、ユーザーが構成するポイントのセットを取得できます。あなたがそれを使用したくない場合、私は、ユーザーをバックグラウンドから分離する簡単な方法を提案することができます。ユーザーのz位置を知っているので、zは0からuserZ +体の太さを表す値をとることができます。

もう一つのアイデアは、バックグラウンドポイント、ボーダーボディー、次のボディーポイントをとると、距離のドロップが簡単に目立つため、いくつかのジョイント(またはジョイント)から開始し、距離がスムーズに変化する場合にのみポイントを取得するウォークオーバーポイントクラウドです。ここで問題となるのは、フロアが滑らかであるため、フロアを体の一部としてカウントすることです。そのため、最低(足首)関節を使用して検証する必要があります。

また、PCL(http://docs.pointclouds.org/trunk/group__segmentation.html)でセグメンテーションを使用することもできますが、フィートフロアの問題が解決されているかどうかはわかりません。彼らはそれで良いと思われる(http://pointclouds.org/documentation/tutorials/planar_segmentation.php)。

+0

はい申し訳ありません編集内容をチェックして、私は例を持つことができますか? –

+0

@OutlawLemur for PCLにはチュートリアルへのリンクがあります。あなた自身でそれを実装することを決めた場合、例はありえません。解決すべき課題です。 – Andrey

0

Kinect for Windows SDK v1.5には、このために変更できるサンプルがあります。

サンプル名:depth-d3dまたはdepthwithcolor-d3d。

彼らは両方とも点群をします。

+0

Cantのヘルプが両方ともC++の例であることに気付きました.C#を使用しています。 –

+1

これらの部分は、管理対象のSDKに移植されていないようです。 – Andrey

6

に役立ちます願っています。

http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Terrain_basics.php

は、結果を確認

:このチュートリアルをチェックしてください

enter image description here

+0

非常に良い。実際のプロジェクトを投稿したり、深さから三角形へのマッピング方法を教えてください。このチュートリアルでは、静的グリッドを作成しますが、マッピングについては話しません。 – davidbates

+0

それは簡単です。深度ストリーム内の各ピクセルは頂点になり、XおよびYはピクセル位置であり、Zは深さである。したがって、このチュートリアルのメソッドを使用すると、三角形のインデックスが作成されます。 – EdgarT

+0

三角形を作成する関数を次に示します。かなり汚れたコード、je je。 http://paste.ideaslabs.com/show/wUQpbnvU5T – EdgarT

関連する問題