2012-06-13 45 views
5

我正在製作一個SDK的程序,當用戶被檢測到時,程序會繪製一個框架讓他們跟隨。我最近看到廣告在我的Xbox,Nike+ Kinect遊戲,看到它是如何顯示的字符的副本做別的事情,如:使用Kinect SDK的身體點雲

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,我可以創建點雲,但仍然圍繞着人的身體不能裁剪。

回答

5

它看起來並不像是顯示完整的點雲,而是顯示藍色陰影強度圖。這可以通過Kinect for Windows SDK的深度圖像完成。 你正在尋找的是玩家指數。這是深度圖像的每個像素中提供的位。爲了獲得播放器索引位,您還必須在初始化代碼中啓用骨架流。

所以這是我如何做到這一點。我修改的Kinect的Windows SDK快速入門的一個發現here加載它,並做如下修改:

//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

不能幫助但注意到那些都是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