2011-12-09 22 views
9

Tôi muốn theo dõi người đầu tiên và sử dụng tay phải của người này để điều hướng trong ứng dụng tôi đã thực hiện.Cách theo dõi MỘT người với Kinect (trackingID)

Tôi có thể tiếp quản con trỏ, bây giờ tôi chỉ muốn chỉ một người đang được theo dõi. Vì vậy, về cơ bản khi một người đang điều hướng trong chương trình, và có những người đi phía sau anh ta hoặc đang tìm kiếm với anh chàng này, nếu họ di chuyển, kinect sẽ không nhận ra bất cứ ai khác.

Tôi làm cách nào để thực hiện điều này, tôi biết đó là nội dung với số trackingId nhưng sao? : s

 foreach (SkeletonData s in allSkeletons.Skeletons) 
     { 

       if (s.TrackingState == SkeletonTrackingState.Tracked) 
       { 
        if (s.TrackingID == 0) 
        { 

         foreach (Joint joint in s.Joints) 
         { 
         } 
        } 
       } 
     } 

Trả lời

6

Mọi người theo dõi đều có chỉ mục người chơi. Chỉ cần bỏ qua người chơi với các chỉ mục khác.
Chỉ mục trình phát là một phần của dữ liệu trong hình ảnh luồng chiều sâu. Bạn phải giải nén nó:

int playerIdx = depthFrame16[i16] & 0x07; 

Để nhận được thông tin này, bạn phải khởi tạo Kinect Runtime của bạn một cách chính xác:

_kinectNui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | .... 

Xem ở đây để biết thêm infos: http://www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx

Tôi hoàn toàn khuyên video hướng dẫn này từ MS: http://research.microsoft.com/apps/video/?id=152249

Nếu bạn nhìn vào ShapeGameDem o đó là đến với SDK bạn có thể xem cách họ làm điều đó. (Họ chỉ cần sử dụng các chỉ số của skeletion trong mảng):

int playerId = 0; 
foreach (SkeletonData data in skeletonFrame.Skeletons) { 
    if (SkeletonTrackingState.Tracked == data.TrackingState) { 
     Player player; 
     if (players.ContainsKey(playerId)) 
     player = players[playerId]; 
     else 
     player = new Player(playerId); 
    } 
    playerId++; 
} 

điều Đơn giản hóa bạn có thể làm điều đó (sử dụng mã của bạn):

int myPlayerIndex = 0; //probably 0 since you are the first person entered the kinect scope 
int playerId = 0; 
foreach (SkeletonData s in allSkeletons.Skeletons) { 
    if(playerId != myPlayerIndex) 
     continue;  

    if (s.TrackingState == SkeletonTrackingState.Tracked) { 
     foreach (Joint joint in s.Joints) 
     { 
     } 
    } 
    playerId++; 
} 

Để làm tròn mọi thứ lên đây là một câu hỏi tương tự trong một diễn đàn MS giải thích nó: http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/d821df8d-39ca-44e3-81e7-c907d94acfca

+0

Vì vậy, thực sự bạn đã tạo một lớp người chơi? Trong lớp này u lưu trữ một id người chơi, playerID này và playerID này lưu trữ các mảng của bộ xương? – Letoir

+0

Tôi đã kiểm tra nó, điều này có nghĩa là tôi phải làm một lớp, của người chơi, sau đó là một lớp xương, để chỉ theo dõi một người hành động. Nó không thể được simpeler sau đó nó trông :) – Letoir

+0

Trên thực tế mã này là từ ShapeGame. Trong mã của bạn, biến allSkeletons chứa danh sách tất cả người chơi. Nếu bạn sử dụng chỉ mục của mọi người chơi làm định danh cho nó, bạn có thể bỏ qua những người khác. –

Các vấn đề liên quan