2012-06-13 16 views
5

Robię program z SDK, gdzie po wykryciu użytkowników, program rysuje szkielet, aby mógł je śledzić. Niedawno widziałem grę reklamowane na mój Xbox, Nike+ Kinect i zobaczył jak to wyświetla kopię charakteru robi coś innego jak:Point-Cloud of Body Używanie Kinect SDK

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

Albo

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

mogę utworzyć punkt -klasowa reprezentacja jedynej wykrytej osoby (nie żadnej z tła)? Z góry dziękuję!


EDIT

Korzystanie this site, mogę tworzyć chmury punktów, ale nadal nie można przyciąć po całym organizmie człowieka.

Odpowiedz

5

Wygląda na to, że nie wyświetlają kompletnej chmury punktów, ale raczej niebieskiej mapy intensywności. Można to zrobić za pomocą obrazu głębokości z sdk systemu Kinect dla systemu Windows. To, czego szukasz, to indeks gracza. Jest to bit dostarczony w każdym pikselu obrazu głębi. Aby uzyskać bit indeksu gracza, musisz również włączyć strumień szkieletu w kodzie inicjalizacyjnym.

Tak to zrobię. Ja modyfikując jeden z Kinect dla Windows quickstarts SDK znaleźć here obciążenie go i wprowadzić następujące zmiany:

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

Lubię stosując ten przykład do testowania kolorów, ponieważ nadal zapewnia Ci widza głębi po prawej stronie bok.Mam załączeniu obraz ten efekt działa poniżej:

enter image description here

Obraz po lewej stronie jest mapa z intensywność lekko zabarwiony danych intensywności poziomie pikseli.

nadzieję, że pomoże David Bates

+2

Po pomyśleniu o efekcie poziomu pikseli. Mógłbyś dla każdego innego piksela zwiększyć intensywność, aby uzyskać efekt blasku pokazany na obrazie próbki. Po prostu sayin :) – davidbates

+0

Fajnie! Wielkie dzięki! –

2

Nie jest to możliwe automatycznie z oficjalnym zestawem SDK Kinect. Ale jest zaimplementowany w alternatywnym SDK o nazwie OpenNI, tam możesz po prostu zdobyć zestaw punktów, z których składa się użytkownik. Jeśli nie chcesz tego użyć, mogę zaproponować raczej łatwą metodę oddzielania użytkownika od tła. Ponieważ znasz pozycję z użytkownika, możesz po prostu wziąć punkty, które z wynosi od 0 do userZ + pewna wartość reprezentująca grubość ciała.

Innym pomysłem jest przechodzenie przez chmurę punktów, począwszy od niektórych stawów (lub stawów) i branie punktów tylko wtedy, gdy odległość zmienia się płynnie, ponieważ jeśli weźmiesz punkt tła, bryłę i następny punkt ciała, spadek odległości będzie łatwo zauważalny. Problem polega na tym, że zaczniesz odliczać podłogę jako część ciała, ponieważ przejście jest płynne, więc powinieneś sprawdzić ją za pomocą najniższego (stawu skokowego).

Lub możesz użyć segmentacji w PCL (http://docs.pointclouds.org/trunk/group__segmentation.html), ale nie wiem, czy problem z dolną stopą został tam rozwiązany. Wygląda na to, że są z nim dobre (http://pointclouds.org/documentation/tutorials/planar_segmentation.php).

+0

Tak przykro sprawdzić zmiany, i mogę mieć jakiś przykład? –

+0

@OutlawLemur dla PCL znajduje się link do samouczka. Jeśli zdecydujesz się na wdrożenie go samodzielnie, nie może istnieć przykład, jest to zadanie do rozwiązania. – Andrey

0

Kinect dla Windows SDK v1.5 ma próbkę, którą można w tym celu zmodyfikować.

Nazwy próbek: depth-d3d lub depthwithcolor-d3d.

Oboje robią chmury punktów.

+0

Nie mogę pomóc, ale zauważ, że są to zarówno przykłady C++, używam C# –

+1

Wygląda na to, że ten kawałek nie został przeniesiony do zarządzanego zestawu SDK – Andrey

6

Można zrobić bardzo prosty triangulacji punktów. sprawdź ten poradnik:

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

Sprawdź rezultat:

enter image description here

+0

Bardzo ładne. czy możesz opublikować rzeczywisty projekt lub jak mapujesz z głębi do trójkątów? Samouczek tworzy statyczną siatkę, ale nie mówi o mapowaniu. – davidbates

+0

To proste. Każdy piksel w strumieniu głębi stał się wierzchołkiem, X i Y są pozycją piksela, a Z jest głębokością. Więc używając metody z tego samouczka, utwórz indeksy trójkątów. – EdgarT

+0

Oto funkcja tworzenia trójkątów. To dość brudny kod, je je. http://paste.ideaslabs.com/show/wUQpbnvU5T – EdgarT

Powiązane problemy