2012-06-13 3 views
5

SDK를 사용하여 프로그램을 만들고 있는데, 사용자가 감지되면 프로그램에서 따라야 할 뼈대가 그려집니다. 나는 최근에 내 X 박스, 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의 심도 이미지를 사용하여이 작업을 수행 할 수 있습니다. 당신이 찾고있는 것은 플레이어 지수입니다. 이는 깊이 이미지의 각 픽셀에 제공된 비트입니다. 플레이어 인덱스 비트를 얻으려면 초기화 코드에서 스켈 레탈 스트림을 활성화해야합니다.

이것이 내가하는 방법입니다. 나는 아직도 오른쪽에 깊이 뷰어를 제공하기 때문에 색상을 테스트하기 위해이 예제를 사용하여 좋아

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

: 나는 Kinect를 Windows 용 SDK의 퀵 중 하나를 수정하고하는 것은 here 부하 그것까지하고 다음과 같이 변경 발견 측면.I 아래 실행이 효과의 화상을 첨부 :

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 help하지만 모두 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

다음은 삼각형을 만드는 함수입니다. 그것은 꽤 더러운 코드입니다, 제이. http://paste.ideaslabs.com/show/wUQpbnvU5T – EdgarT

관련 문제