2012-10-31 36 views
8

मेरे आवेदन में मुझे गहराई फ्रेम गहराई फ्रेम नमूना से प्राप्त गहराई फ्रेम के समान मिल रहा है। जो मुझे समझ में नहीं आता है, छवि में अलग-अलग स्तर क्यों हैं? मुझे नहीं पता कि मैं गहराई के मूल्यों में इन अचानक परिवर्तनों को क्या कहूं। स्पष्ट रूप से मेरे दाहिने हाथ का मेरा आधा काला है और मेरा बायां हाथ 3 ऐसे स्तरों में बांटा गया है। यह क्या है और मैं इसे कैसे हटा सकता हूं?किनेक्ट गहराई छवि

Kinect Depth Basics Sample http://i46.tinypic.com/2hwekxd.jpg

जब मैं KinectExplorer नमूना अनुप्रयोग चलाने के रूप में निम्न प्रकार मैं गहराई मिलता है। यह गहराई की छवि है जिसे मैं कच्चे गहराई डेटा से उत्पन्न करना चाहता हूं।

Kinect Explorer http://i50.tinypic.com/2rwx1z5.jpg

मैं OpenCV के साथ माइक्रोसॉफ्ट Kinect एसडीके के (v1.6) का उपयोग कर रहा NuiApi। मैं निम्नलिखित कोड है:

BYTE *pBuffer = (BYTE*)depthLockedRect.pBits; //pointer to data having 8-bit jump 
USHORT *depthBuffer = (USHORT*) pBuffer; //pointer to data having 16-bit jump 
int cn = 4; 
this->depthFinal = cv::Mat::zeros(depthHeight,depthWidth,CV_8UC4); //8bit 4 channel 
for(int i=0;i<this->depthFinal.rows;i++){ 
    for(int j=0;j<this->depthFinal.cols;j++){ 
     USHORT realdepth = ((*depthBuffer)&0x0fff); //Taking 12LSBs for depth 
     BYTE intensity = (BYTE)((255*realdepth)/0x0fff); //Scaling to 255 scale grayscale 
     this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 0] = intensity; 
     this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 1] = intensity; 
     this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 2] = intensity; 
     depthBuffer++; 
    } 
} 
+0

कृपया अपनी छवियों को दोबारा जांचें, वे दिखाई नहीं दे रहे हैं। –

+0

छवि यूआरएल बदल दिया। फिर से जांचें। – thinkquester

+0

'' cn'' क्या है और क्या इसे वास्तव में '' 4'' होना चाहिए और '' 3'' नहीं होना चाहिए? यह देखने के लिए भी गहरा होगा कि आप वास्तव में छवि को कहां आउटपुट करते हैं। – Tim

उत्तर

0

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

5

आपके द्वारा देखे जाने वाले पट्टियों %256 ऑपरेशन के कारण गहराई के मानों के wrapping के कारण हैं। इसके बजाय सापेक्ष आपरेशन (%256) है, जो खड़ी कर रहा है लागू करने का बैंड दिखाने के लिए, पूरी रेंज के साथ गहराई मूल्यों को पुन: मैप, जैसे:

BYTE intensity = depth == 0 || depth > 4095 ? 0 : 255 - (BYTE)(((float)depth/4095.0f) * 255.0f); 

मामले में अपनी अधिकतम गहराई 2048 है, 2047 के साथ 4095 की जगह ।

अधिक संकेत:

  1. Kinect शायद एक 11bit मूल्य (0-2047) देता है, लेकिन आप केवल 8bit (0-255) का उपयोग करें।
  2. नई Kinect संस्करणों एक 12bit मूल्य (0-4096)
  3. Kinect एक्सप्लोरर स्रोत कोड में
  4. लौटने के लिए लग रहे हैं, वहाँ एक फ़ाइल DepthColorizer.cs बुलाया जादू का सबसे हो रहा है, जहां है। मेरा मानना ​​है कि यह कोड गिनती मूल्यों को किनेक्ट एक्सप्लोरर में इतना आसान बनाता है - लेकिन मैं गलत हो सकता हूं।
+0

यदि आपने मॉड्यूलो के रूप में कम मूल्य का उपयोग कर गहराई के मूल्यों को लपेट लिया है, तो क्या बैंड आगे अलग होंगे? –

1

मुझे एक ही समस्या का सामना करना पड़ा, जबकि मैं एक परियोजना पर काम कर रहा था जिसमें गहराई के मानचित्र का दृश्य शामिल था। हालांकि मैंने केनेक्ट एसडीके पुस्तकालयों के बजाय ओपनसीवी के साथ ओपनएनआई एसडीके का इस्तेमाल किया। समस्या एक जैसी थी और इसलिए समाधान आपके लिए काम करेगा क्योंकि यह मेरे लिए किया गया था।

जैसा कि आपके प्रश्न के पिछले उत्तरों में बताया गया है, किनेक्ट गहराई नक्शा 11-बिट (0-2047) है। उदाहरण के दौरान, 8-बिट डेटा प्रकारों का उपयोग किया जाता है।

क्या मैं इस के आसपास पाने के लिए मेरे कोड में किया था एक 16-बिट चटाई में गहराई नक्शा प्राप्त करने के लिए, और फिर इसे Mat

के लिए convertTo समारोह में स्केलिंग विकल्पों का उपयोग करके चटाई uchar 8 बिट में बदलने का था सबसे पहले मैं

Mat depthMat16UC1(XN_VGA_Y_RES, XN_VGA_X_RES, CV_16UC1); 

यहाँ XN_VGA_Y_RES, XN_VGA_X_RES हासिल कर ली गहराई नक्शे के संकल्प को परिभाषित करता है गहराई डेटा प्राप्त करने के लिए एक Mat आरंभ कर देगा।

कोड जहां मैं इस प्रकार है कार्य करें:

depthMat16UC1.data = ((uchar*)depthMD.Data()); 
depthMat16UC1.convertTo(depthMat8UC1, CV_8U, 0.05f); 
imshow("Depth Image", depthMat8UC1); 

depthMD डेटा Kinect सेंसर से लिया गया युक्त मेटाडाटा है।

मुझे आशा है कि यह आपको किसी भी तरह से मदद करेगा।

0

किनेक्ट v2 8 मीटर गहराई देख सकता है, (लेकिन 4.5 से कम सटीकता)। यह लगभग 0.4 मीटर शुरू होता है। इसलिए किसी को रंग में 8000 नंबर व्यक्त करने की आवश्यकता है। ऐसा करने का एक तरीका आरजीबी रंगों का उपयोग केवल एक संख्या है। तो आप संभावित रूप से 255x255x255 i पिक्सेल की तरह एक नंबर स्टोर कर सकते हैं। या यदि आपके पास अलग-अलग रंग प्रारूप थे तो यह अलग होगा। उस 255x255x255 अधिकतम संख्या में 8000 स्टोर करने से परिणामस्वरूप आर + जी + बी की निश्चित मात्रा होगी, और यह बैंडिंग प्रभाव देता है।

लेकिन आप 8000 को समर्पित कर सकते हैं या किसी संख्या को घटा सकते हैं, या एक निश्चित मूल्य से परे हटा सकते हैं।