2011-12-09 10 views
9

मैं पहले व्यक्ति को ट्रैक करना चाहता हूं, और इस एप्लिकेशन के नेविगेट करने के लिए इस व्यक्ति के दाहिने हाथ का उपयोग करना चाहता हूं।Kinect (ट्रैकिंगID) के साथ एक व्यक्ति को ट्रैक करने के लिए कैसे करें

मैं कर्सर को ले सकता हूं, अब मैं सिर्फ एक व्यक्ति को ट्रैक करना चाहता हूं। तो मूल रूप से जब एक व्यक्ति कार्यक्रम में नेविगेट कर रहा है, और वहां लोग चल रहे हैं या इस लड़के के साथ देख रहे हैं, अगर वे आगे बढ़ते हैं, तो किनेक्ट को किसी और को पहचानना नहीं चाहिए।

मैं इसे कैसे कार्यान्वित कर सकता हूं, मुझे पता है कि यह trackingId के साथ कुछ है लेकिन क्या? : एस

 foreach (SkeletonData s in allSkeletons.Skeletons) 
     { 

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

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

उत्तर

6

प्रत्येक ट्रैक किए गए व्यक्ति के पास प्लेयर इंडेक्स होता है। अन्य इंडेक्स के साथ खिलाड़ियों को अनदेखा करें।
प्लेयर इंडेक्स गहराई स्ट्रीम छवि में डेटा का हिस्सा है। आप इसे निकालने के लिए है:

int playerIdx = depthFrame16[i16] & 0x07; 

आदेश में इस जानकारी आप सही तरीके से अपने Kinect क्रम प्रारंभ करने में है प्राप्त करने के लिए:

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

यहाँ अधिक infos के लिए देखें: http://www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx

मैं पूरी तरह की सलाह देते हैं एमएस से यह वीडियो ट्यूटोरियल: http://research.microsoft.com/apps/video/?id=152249

यदि आप ShapeGameDem में देखते हैं ओ एसडीके के साथ आ रहा है आप देख सकते हैं कि वे इसे कैसे करते हैं। (वे सिर्फ सरणी में skeletion के सूचकांक का उपयोग करें):

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

सरल चीजें आप ऐसा कर सकते हैं (अपने कोड का उपयोग):

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

यहाँ बातें दौर के लिए में एक ऐसी ही सवाल है एक एमएस मंच जो इसे समझाता है: http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/d821df8d-39ca-44e3-81e7-c907d94acfca

+0

तो वास्तव में आपने एक खिलाड़ी की कक्षा बनाई है? इस कक्षा में आप एक खिलाड़ी आईडी स्टोर करते हैं, यह प्लेयरआईडी और यह प्लेयरआईडी कंकाल की सरणी स्टोर करता है? – Letoir

+0

मैंने इसे चेक आउट किया, इसका मतलब है कि मुझे एक व्यक्ति की कक्षा को ट्रैक करने के लिए, हड्डियों की एक कक्षा के बाद, खिलाड़ी की कक्षा बनाना है। यह सिम्पलर नहीं हो सकता है तो यह दिखता है :) – Letoir

+0

असल में यह कोड आकार गेम से है। आपके कोड में ऑलस्केलेट्स वेरिएबल सभी खिलाड़ियों की एक सूची रखता है। यदि आप इसके लिए पहचानकर्ता के रूप में प्रत्येक खिलाड़ी की अनुक्रमणिका का उपयोग करते हैं, तो आप दूसरों को छोड़ सकते हैं। –

संबंधित मुद्दे