2012-04-30 14 views
8

मैं नए किनेक्ट एसडीके v1.0.3.190 के साथ खेल रहा हूं। (स्टैक ओवरफ्लो में अन्य संबंधित प्रश्न किनेक्ट के पिछले एसडीके पर हैं) मुझे किनेक्ट से गहराई और रंग धाराएं मिलती हैं। चूंकि गहराई और आरजीबी धाराओं को विभिन्न सेंसर के साथ पकड़ा जाता है, इसलिए नीचे दिखाए जा सकने वाले दो फ्रेमों के बीच एक गलत संरेखण होता है।किनेक्ट गहराई और छवि फ्रेम्स संरेखण

केवल आरजीबी RGB

केवल गहराई Depth

गहराई & आरजीबी RGB & Depth equally blended

मैं उन्हें संरेखित करने की आवश्यकता है और वहाँ MapDepthToColorImagePoint वास्तव में इस उद्देश्य के लिए नामित किया गया एक समारोह है। हालांकि यह काम नहीं लग रहा है। यहाँ एक समान रूप से मिश्रित (गहराई और मैप किए गए रंग) परिणाम है जिसके नीचे निम्न कोड

  Parallel.For(0, this.depthFrameData.Length, i => 
     { 
      int depthVal = this.depthFrameData[i] >> 3; 
      ColorImagePoint point = this.kinectSensor.MapDepthToColorImagePoint(DepthImageFormat.Resolution640x480Fps30, i/640, i % 640, (short)depthVal, ColorImageFormat.RgbResolution640x480Fps30); 
      int baseIndex = Math.Max(0, Math.Min(this.videoBitmapData.Length - 4, (point.Y * 640 + point.X) * 4)); 

      this.mappedBitmapData[baseIndex] = (byte)((this.videoBitmapData[baseIndex])); 
      this.mappedBitmapData[baseIndex + 1] = (byte)((this.videoBitmapData[baseIndex + 1])); 
      this.mappedBitmapData[baseIndex + 2] = (byte)((this.videoBitmapData[baseIndex + 2])); 
     }); 

जहां पैरामीटर, संकल्प, सरणी आकार के

depthFrameData -> raw depth data (short array) 

videoBitmapData -> raw image data (byte array) 

mappedBitmapData -> expected result data (byte array) 

आदेश सही हैं के साथ बनाया जाता है (डबल चेक) ।

कोड का परिणाम है: depth and MapDepthToColorImagePoint

मिसलिग्न्मेंट जारी है! इससे भी बदतर यह है कि, MapDepthToColorImagePoint का उपयोग करने के बाद परिणाम छवि मूल छवि के साथ बिल्कुल वही है।

मेरी सराहना करने के लिए कोई मेरी मदद कर सकता है या कम से कम मुझे बता सकता है कि MapDepthToColorImagePoint क्या है (मान लीजिए कि मैंने इसकी कार्यक्षमता को गलत समझा है)?

उत्तर

1

यह एक बहुत ही आम समस्या है, दो छवियों को सिंक करने के लिए गणित में कुछ अंतर्निहित है क्योंकि दो कैमरे दो अलग-अलग स्थानों पर बैठे हैं। एक 3 डी कैमरा द्वारा उत्पादित दो वीडियो फीड लेने और उन्हें सिंक करने की कोशिश करने की तरह। वे हमेशा थोड़ा दूर रहेंगे।

सुधार के लिए

दो विचारों:

  1. मैन्युअल गहराई छवि से बिट्स बदलाव के रूप में आप यह गणना।
  2. Kinect के लिए एक शेकर मोटर जोड़े शोर को कम करने: http://www.youtube.com/watch?v=CSBDY0RuhS4 (मैं एक साधारण पेजर मोटर पाया है प्रभावी होने के लिए।)

MapDepthToColorImagePoint कंकाल एपीआई में उपयोग करने के लिए एक कंकाल बिंदु को मैप करने के लिए है एक गहराई बिंदु और फिर एक छवि बिंदु पर ताकि आप आरजीबी छवि के शीर्ष पर जोड़ दिखा सकें।

उम्मीद है कि इससे मदद मिलती है।

4

यह हमेशा थोड़ा होता है क्योंकि दो सेंसर थोड़ा अलग स्थानों पर रखा जाता है जाएगा।

यह प्रयास करें: अपने दो आँखों से किसी वस्तु पर

देखो, तो, उसके बाद ही अपनी दायीं आंख केवल अपने बाईं आंख उपयोग करके देखें। चीजें थोड़ा अलग दिखती हैं क्योंकि आपकी दो आंखें बिल्कुल एक ही स्थान पर नहीं हैं।

हालांकि: कुछ एपीआई कोडों के साथ कई मुद्दों को सही करना संभव है।

मैं विंडोज 1.5 के लिए किनेक्ट का उपयोग कर रहा हूं, इसलिए एपीआई 1.0 से थोड़ा अलग है।

short[] depth=new short[320*240]; 
// fill depth with the kinect data 
ColorImagePoint[] colorPoints=new ColorImagePoint[320*240]; 
// convert mappings 
kinect.MapDepthFrameToColorFrame(DepthImageFormat.Resolution320x240Fps30, 
      depth, ColorImageFormat.RgbResolution640x480Fps30, colorPoints); 
// now do something with it 
for(int i=0;i<320*240;i++) 
{ 
    if (we_want_to_display(depth[i])) 
    { 
    draw_on_image_at(colorPoints[i].X,colorPoints[i].Y); 
    } 
} 

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

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