2012-01-09 24 views
15

मैं एक किनेक्ट से गहराई और रंग की जानकारी प्राप्त करने के लिए माइक्रोसॉफ्ट किनेक्ट एसडीके का उपयोग कर रहा हूं और फिर उस जानकारी को बिंदु बिंदु में परिवर्तित कर रहा हूं। मुझे वास्तविक दुनिया के कैमरे के केंद्र के साथ वास्तविक दुनिया समन्वय में होने वाली गहराई की जानकारी की आवश्यकता है।माइक्रोसॉफ्ट किनेक्ट एसडीके गहराई डेटा वास्तविक दुनिया समन्वय

मैंने कई रूपांतरण फ़ंक्शंस देखे हैं लेकिन ये स्पष्ट रूप से ओपनएनआई और गैर-माइक्रोसॉफ्ट ड्राइवरों के लिए हैं। मैंने पढ़ा है कि किनेक्ट से आने वाली गहराई की जानकारी पहले ही मिलीमीटर में है, और 11 बिट्स या कुछ में निहित है।

मैं इस बिट जानकारी को वास्तविक दुनिया समन्वय में कैसे परिवर्तित करूं जिसका उपयोग मैं कर सकता हूं?

अग्रिम धन्यवाद!

उत्तर

10

यह Microsoft.Research.Kinect.Nui.SkeletonEngine वर्ग का उपयोग कर विंडोज पुस्तकालय के लिए Kinect के भीतर के लिए catered है, और निम्न विधि:

public Vector DepthImageToSkeleton (
    float depthX, 
    float depthY, 
    short depthValue 
) 

इस विधि गहराई छवि द्वारा उत्पादित मैप कर देंगे असली दुनिया माप के आधार पर, किनेक्ट वेक्टर स्केलेबल है।

:

वहाँ (जब मैं अतीत में एक जाल बना लिया है) से, Kinect गहराई छवि के द्वारा बनाई गई बिटमैप में बाइट सरणी की गणना के बाद, आप वेक्टर की एक नई सूची निम्न के समान अंक बनाने

 var width = image.Image.Width; 
     var height = image.Image.Height; 
     var greyIndex = 0; 

     var points = new List<Vector>(); 

     for (var y = 0; y < height; y++) 
     { 
      for (var x = 0; x < width; x++) 
      { 
       short depth; 
       switch (image.Type) 
       { 
        case ImageType.DepthAndPlayerIndex: 
         depth = (short)((image.Image.Bits[greyIndex] >> 3) | (image.Image.Bits[greyIndex + 1] << 5)); 
         if (depth <= maximumDepth) 
         { 
          points.Add(nui.SkeletonEngine.DepthImageToSkeleton(((float)x/image.Image.Width), ((float)y/image.Image.Height), (short)(depth << 3))); 
         } 
         break; 
        case ImageType.Depth: // depth comes back mirrored 
         depth = (short)((image.Image.Bits[greyIndex] | image.Image.Bits[greyIndex + 1] << 8)); 
         if (depth <= maximumDepth) 
         { 
          points.Add(nui.SkeletonEngine.DepthImageToSkeleton(((float)(width - x - 1)/image.Image.Width), ((float)y/image.Image.Height), (short)(depth << 3))); 
         } 
         break; 
       } 

       greyIndex += 2; 
      } 
     } 

ऐसा करके, इसका अंतिम परिणाम मिलीमीटर में संग्रहीत वैक्टरों की एक सूची है, और यदि आप सेंटीमीटर 100 (आदि) से गुणा करना चाहते हैं।

+0

धन्यवाद लुईस! ठीक वही है जो मैं बाद में था, हालांकि मैं अभी भी गहराई मूल्य प्राप्त करने के लिए बिट्सफिफ्टिंग व्यवसाय को समझ नहीं पा रहा हूं। –

+1

मेरा मानना ​​है कि DepthImageToSkeleton विधि को KinectSensor ऑब्जेक्ट पर MapDepthToSkeletonPoint पर रीफैक्टर किया गया है –

+0

बस रिकॉर्ड के लिए: http://arena.openni.org/OpenNIArena/Applications/ViewApp.aspx?app_id=426 – EdgarT

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