2012-06-13 13 views
5

Tôi đang tạo một chương trình với SDK, nơi khi người dùng được phát hiện, Chương trình sẽ vẽ một bộ xương để họ theo dõi. Gần đây tôi đã nhìn thấy một trò chơi được quảng cáo trên Xbox của tôi, Nike+ Kinect và thấy như thế nào nó sẽ hiển thị một bản sao của nhân vật làm cái gì khác như:Point-Cloud of Body Sử dụng Kinect SDK

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

Hoặc

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

Tôi có thể tạo một điểm - đại diện rõ ràng của người duy nhất được phát hiện (không phải bất kỳ nền nào)? Cảm ơn trước!


EDIT

Sử dụng this site, tôi có thể tạo ra những đám mây điểm, nhưng vẫn không thể cắt xung quanh cơ thể của con người.

Trả lời

5

Có vẻ như chúng không hiển thị một đám mây điểm hoàn chỉnh mà là một bản đồ cường độ bóng mờ màu xanh lam. Điều này có thể được thực hiện với hình ảnh sâu từ Kinect cho Windows sdk. Điều bạn đang tìm kiếm là chỉ mục của người chơi. Đây là một bit được cung cấp trong mỗi pixel của hình ảnh độ sâu. Để có được bit chỉ mục của trình phát, bạn cũng phải bật luồng xương trong mã khởi tạo của mình.

Vì vậy, đây là cách tôi sẽ làm điều đó. Tôi đang thay đổi một trong những Kinect cho Windows quickstarts SDK tìm thấy here tải nó lên và thực hiện các thay đổi sau:

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

Tôi thích sử dụng ví dụ này để thử nghiệm các màu sắc vì nó vẫn còn cung cấp cho bạn với người xem sâu ở bên phải bên.Tôi có kèm theo một hình ảnh của hiệu ứng này chạy dưới đây:

enter image description here

Những hình ảnh bên trái là bản đồ cường độ với các dữ liệu cường độ mức độ điểm ảnh hơi màu.

Hy vọng rằng sẽ giúp David Bates

+2

Sau khi suy nghĩ về hiệu ứng cấp pixel. Bạn có thể cho mỗi pixel khác tăng cường độ để bạn có thể nhận được hiệu ứng lấp lánh đó được hiển thị trên hình ảnh mẫu. Chỉ cần sayin :) – davidbates

+0

Tuyệt! Cảm ơn rất nhiều! –

2

Điều này là không thể tự động với Kinect SDK chính thức. Nhưng nó được thực hiện trong SDK thay thế được gọi là OpenNI, ở đó bạn chỉ có thể nhận được tập hợp các điểm mà người dùng bao gồm. Nếu bạn không muốn sử dụng nó, tôi có thể đề xuất phương pháp tách người dùng khá dễ dàng khỏi nền. Vì bạn biết vị trí z của người dùng, bạn chỉ có thể lấy điểm mà z là từ 0 đến userZ + một số giá trị đại diện cho độ dày của cơ thể. Một ý tưởng khác là đi qua điểm đám mây bắt đầu từ một số khớp (hoặc khớp) và lấy điểm chỉ khi khoảng cách thay đổi trơn tru, bởi vì nếu bạn lấy điểm nền, phần thân biên giới và điểm cơ thể tiếp theo, khoảng cách sẽ dễ dàng nhận thấy. Vấn đề ở đây là bạn sẽ bắt đầu đếm sàn như một phần của cơ thể, bởi vì quá trình chuyển đổi có trơn tru, vì vậy bạn nên xác nhận nó bằng cách sử dụng khớp thấp nhất (mắt cá chân).

Hoặc bạn có thể sử dụng phân đoạn trong PCL (http://docs.pointclouds.org/trunk/group__segmentation.html) nhưng tôi không biết liệu vấn đề bàn chân có được giải quyết ở đó hay không. Có vẻ như họ tốt với nó (http://pointclouds.org/documentation/tutorials/planar_segmentation.php).

+0

Có lỗi kiểm tra chỉnh sửa, và tôi có thể có một ví dụ? –

+0

@OutlawLemur cho PCL có liên kết đến hướng dẫn. Nếu bạn quyết định tự mình thực hiện thì không thể là một ví dụ, đó là nhiệm vụ cần được giải quyết. – Andrey

0

Kinect cho Windows SDK v1.5 có mẫu có thể được sửa đổi cho điều này.

Tên mẫu: depth-d3d hoặc depthwithcolor-d3d.

Cả hai đều làm đám mây điểm.

+0

Không thể giúp đỡ nhưng chú ý rằng cả hai ví dụ C++, tôi đang sử dụng C# –

+1

Dường như những phần này không được chuyển sang managed SDK – Andrey

6

Bạn có thể làm một tam giác rất đơn giản của các điểm. Kiểm tra hướng dẫn này:

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

Kiểm tra kết quả:

enter image description here

+0

Rất đẹp. bạn có thể đăng các dự án thực tế hoặc làm thế nào bạn đang lập bản đồ từ chiều sâu đến hình tam giác? Hướng dẫn tạo một lưới tĩnh nhưng không nói lên ánh xạ. – davidbates

+0

Thật đơn giản. Mỗi điểm ảnh ở độ sâu trở thành một đỉnh, X và Y là vị trí điểm ảnh và Z là độ sâu. Vì vậy, bằng cách sử dụng phương pháp trên hướng dẫn đó tạo ra các chỉ số của các hình tam giác. – EdgarT

+0

Đây là chức năng tạo tam giác. Nó khá bẩn mã, je je. http://paste.ideaslabs.com/show/wUQpbnvU5T – EdgarT