2012-06-13 11 views
5

का उपयोग कर शरीर के पॉइंट-क्लाउड मैं एसडीके के साथ एक प्रोग्राम बना रहा हूं, जहां उपयोगकर्ताओं का पता चला है, कार्यक्रम उनके लिए अनुसरण करने के लिए एक कंकाल खींचता है। मैं हाल ही में एक खेल पर मेरे Xbox, Nike+ Kinect विज्ञापित देखा और देखा कि यह कैसे की तरह कुछ और कर चरित्र की एक प्रति प्रदर्शित करता है:किनेक्ट एसडीके

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

ऐसा लगता है कि वे एक पूर्ण बिंदु क्लाउड प्रदर्शित नहीं कर रहे हैं बल्कि नीले छायांकित तीव्रता मानचित्र को प्रदर्शित कर रहे हैं। यह विंडोज एसडीके के लिए किनेक्ट से गहराई से छवि के साथ किया जा सकता है। जो आप खोज रहे हैं वह प्लेयर इंडेक्स है। यह गहराई छवि के प्रत्येक पिक्सेल में एक प्रदान किया गया बिट है। प्लेयर इंडेक्स बिट प्राप्त करने के लिए आपको अपने प्रारंभिक कोड में कंकाल स्ट्रीम को भी सक्षम करना होगा।

तो इस तरह मैं इसे करूँगा।

//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 एसडीके quickstarts में से एक को संशोधित कर रहा हूँ here लोड इसे और निम्न परिवर्तन कर पाया पक्ष।मैं नीचे चल रहा इस आशय की एक छवि जुड़ी है

enter image description here

बाईं ओर छवि थोड़ा रंग पिक्सेल स्तर तीव्रता डेटा के साथ तीव्रता नक्शा है।

आशा है कि मदद करता है डेविड बेट्स

+2

पर पिक्सेल स्तर प्रभाव के बारे में सोचने के बाद पोर्ट नहीं किया गया था। आप हर दूसरे पिक्सेल के लिए तीव्रता में वृद्धि कर सकते हैं ताकि आप नमूना छवि पर दिखाए गए चमकदार प्रभाव को प्राप्त कर सकें। बस sayin :) – davidbates

+0

कूल! आपका बहुत बहुत धन्यवाद! –

2

यह आधिकारिक किनेक्ट एसडीके के साथ स्वचालित रूप से संभव नहीं है। लेकिन इसे ओपनएनआई नामक वैकल्पिक एसडीके में कार्यान्वित किया गया है, वहां आप केवल उन बिंदुओं का सेट प्राप्त कर सकते हैं जिनमें से उपयोगकर्ता में शामिल हैं। यदि आप इसका उपयोग नहीं करना चाहते हैं तो मैं पृष्ठभूमि से उपयोगकर्ता को अलग करने की बजाय आसान तरीका सुझा सकता हूं। चूंकि आप उपयोगकर्ता की जेड-स्थिति जानते हैं, आप केवल उन बिंदुओं को ले सकते हैं जो z 0 से userZ + कुछ मूल्य शरीर की मोटाई का प्रतिनिधित्व करते हैं।

एक और विचार कुछ संयुक्त (या जोड़ों) से शुरू होने वाले पॉइंट क्लाउड पर चल रहा है और केवल तभी अंक ले रहा है जब दूरी आसानी से बदल रही हो, क्योंकि यदि आप पृष्ठभूमि बिंदु लेते हैं, सीमा शरीर और अगले शरीर को इंगित करते हैं तो दूरी की बूंद आसानी से ध्यान देने योग्य होगी। यहां समस्या यह है कि आप शरीर के हिस्से के रूप में गिनती की गिनती शुरू कर देंगे, क्योंकि वहां संक्रमण आसान है, इसलिए आपको निम्नतम (एंकल) संयुक्त का उपयोग करके इसे सत्यापित करना चाहिए।

या आप पीसीएल (http://docs.pointclouds.org/trunk/group__segmentation.html) में सेगमेंटेशन का उपयोग कर सकते हैं, लेकिन मुझे नहीं पता कि पैर-फर्श समस्या हल हो गई है या नहीं। ऐसा लगता है कि वे इसके साथ अच्छे हैं (http://pointclouds.org/documentation/tutorials/planar_segmentation.php)।

+0

हाँ खेद जाँच संपादन, और मैं एक उदाहरण हो सकता है? पीसीएल के लिए –

+0

@OutlawLemur ट्यूटोरियल के लिए लिंक है। यदि आप इसे स्वयं लागू करने का निर्णय लेते हैं तो कोई उदाहरण नहीं हो सकता है, यह हल करने का कार्य है। – Andrey

0

विंडोज एसडीके v1.5 के लिए किनेक्ट एक नमूना है जिसे इसके लिए संशोधित किया जा सकता है।

नमूना नाम: गहराई-डी 3 डी या गहराई के साथ-डी 3 डी।

वे दोनों बादलों को इंगित करते हैं।

+0

मदद कर सकते हैं लेकिन ध्यान दें कि सी ++ उदाहरण दोनों हैं, मैं सी # –

+1

का उपयोग कर रहा हूं ऐसा लगता है कि इन टुकड़े को प्रबंधित एसडीके – Andrey

6

आप अंक की एक बहुत ही सरल ट्राईऐन्ग्युलेशंस कर सकते हैं। इस ट्यूटोरियल की जाँच करें:

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

परिणाम की जाँच करें:

enter image description here

+0

बहुत अच्छा। क्या आप वास्तविक प्रोजेक्ट पोस्ट कर सकते हैं या आप गहराई से त्रिकोण तक कैसे मैप कर रहे हैं? ट्यूटोरियल एक स्थिर ग्रिड बनाता है लेकिन मैपिंग पर बात नहीं करता है। – davidbates

+0

यह आसान है। गहराई में प्रत्येक पिक्सेल एक चरम पर बन गया, एक्स और वाई पिक्सेल स्थिति है और जेड गहराई है। तो उस ट्यूटोरियल पर विधि का उपयोग त्रिकोण के सूचकांक बनाते हैं। – EdgarT

+0

त्रिकोण बनाने के लिए यहां फ़ंक्शन है। यह बहुत गंदे कोड, जे जे। http://paste.ideaslabs.com/show/wUQpbnvU5T – EdgarT

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