विंडोज एसडीके के लिए काइनेट। भाग 2. डेटा स्ट्रीम


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

Kinect की क्षमताओं का उपयोग करने के लिए लक्ष्य निर्धारित करने के बाद, पहली बात यह है कि वांछित सेंसर का चयन करें और आवश्यक डेटा धाराओं को प्रारंभ करें। याद रखें कि एक ही समय में अधिकतम 4 सेंसर कंप्यूटर से जुड़े हो सकते हैं? KinectSensor वर्ग का उपयोग करना उन सभी के माध्यम से हल करने के लिए एक बड़ी बात नहीं है। प्रलेखन में आपको पहले जुड़े सेंसर को चुनने और सक्षम करने का ऐसा तरीका मिलेगा:

KinectSensor kinect = KinectSensor.KinectSensors.Where(s => s.Status == KinectStatus.Connected).FirstOrDefault(); kinect.Start(); 


उसके बाद, आप चयनित सेंसर के लिए आवश्यक धाराओं को कॉन्फ़िगर और सक्षम कर सकते हैं। और यह सेंसर से प्राप्त डेटा की तीन धाराओं पर ठीक है जो हम थोड़ा ध्यान केन्द्रित करते हैं।

सेंसर स्ट्रीम

MSDN को ध्यान से पढ़ने के बाद, आप इस थ्रेड के बारे में कुछ उपयोगी जानकारी पा सकते हैं। उदाहरण के लिए, वीडियो स्ट्रीम को प्रारंभ करते समय डेवलपर गुणवत्ता स्तर और छवि प्रारूप सेट करने के लिए स्वतंत्र है। सेंसर से प्रेषित डेटा की मात्रा और गति, जो बदले में, यूएसबी 2.0 बैंडविड्थ द्वारा सीमित है, सीधे गुणवत्ता स्तर पर निर्भर करती है। तो 1280x960 के रिज़ॉल्यूशन वाली तस्वीर के लिए, फ्रेम प्रति सेकंड की संख्या 12 होगी, और 640x480 - 30 के रिज़ॉल्यूशन वाली तस्वीर के लिए। छवि प्रारूप रंग मॉडल द्वारा निर्धारित किया जाता है और आरजीबी या वाईयूवी हो सकता है।

गुणवत्ता स्तर और छवि प्रारूप के संयोजन ColorImageFormat गणन द्वारा दर्शाए जाते हैं । इसके तीन मान छवि में प्रत्येक पिक्सेल के 32-बिट एन्कोडिंग को निर्धारित करते हैं: RgbResolution1280x960Fps12 , RgbResolution640x480Fps30 और YuvResolution640x480Fps15 , और चौथा 16-बिट RawYuvResolution640x480Fps15 । बड़ी हैरानी की बात है YuvResolution640x480Fps15 । MSDN स्पष्ट रूप से ( यहां और यहां ) बताता है कि यह YUV RGB32 में परिवर्तित हो गया है ... लेकिन, फिर भी, YUV बने रहना ...

सेंसर से वीडियो स्ट्रीम प्राप्त करना शुरू करने के लिए, इसी स्ट्रीम को आरंभीकृत किया जाना चाहिए:

 //      RGB   640x480(30fps) kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30); //      ,         kinect.ColorFrameReady +=SensorColorFrameReady; 


MSDN पर थोड़ा और विस्तृत उदाहरण पाया जा सकता है।

सेंसर ऑडियो स्ट्रीम

आप पहले से ही जानते हैं कि किनेक्ट में 24-बिट एनालॉग-टू-डिजिटल कनवर्टर का उपयोग करके चार माइक्रोफोन का एक अंतर्निहित सेट है, और अंतर्निहित ऑडियो प्रोसेसर में इको रद्द और शोर में कमी शामिल है। प्रत्येक माइक्रोफ़ोन को थोड़ा फोकस करने के लिए सेट किया गया है। क्या इको या शोर में कमी शामिल है, डेवलपर पर निर्भर करता है, अर्थात इन विकल्पों को ऑडियो स्ट्रीम के प्रारंभिक चरण में सेट किया गया है। स्पीकर और सेंसर के बीच की इष्टतम दूरी 1-3 मीटर है।

Kinect की ऑडियो क्षमताओं को विभिन्न तरीकों से उपयोग किया जा सकता है, उदाहरण के लिए, उच्च-गुणवत्ता वाले ऑडियो कैप्चर, ऑडियो सिग्नल की स्थिति या भाषण की पहचान के लिए। हम बाद में भाषण मान्यता के बारे में बात करेंगे, और अब मैं Kinect की एक विशेषता पर ध्यान देना चाहूंगा, जिसका विवरण मुझे प्रलेखन में नहीं मिला (क्या यह खराब खोजा गया था?)। ऑडियो स्ट्रीम को शुरू करने में चार सेकंड से थोड़ा कम समय लगता है। यह ध्यान में रखा जाना चाहिए, और, सेंसर के स्टार्ट () विधि को कॉल करने के बाद, ऑडियो स्ट्रीम पैरामीटर सेट करने से पहले चार सेकंड की देरी करें - KinectSensor.AudioSource । ध्वनि की दिशा निर्धारित करने का एक उदाहरण MSDN पर पाया जा सकता है।

सेंसर रेंजफाइंडर डेटा स्ट्रीम

सबसे दिलचस्प धारा होनी चाहिए। और यह मुख्य रूप से उन लोगों के लिए दिलचस्प है जो मानव आकृति (कंकाल ट्रैकिंग) के बारे में अधिक जानना चाहते हैं।

यह धारा उन फ़्रेमों से बनती है जिसमें प्रत्येक पिक्सेल में कैमरे के देखने के क्षेत्र के कुछ निर्देशांक में सेंसर के विमान से निकटतम वस्तु तक की दूरी (मिलीमीटर में) होती है। डेटा स्ट्रीमफाइंडर डेटा स्ट्रीम के लिए, वीडियो स्ट्रीम के मामले में, आप एक फ्रेम का रिज़ॉल्यूशन सेट कर सकते हैं, जो कि डेप्थइमफॉर्मफॉर्म एन्यूमरेशन द्वारा निर्धारित किया जाता है। 30 प्रति सेकंड के फ्रेम दर पर, डेवलपर संकल्प 80x60 ( रिज़ॉल्यूशन 80x60Fps30), 320x240 ( रिज़ॉल्यूशन 320x240Fps30) और 640x480 ( रिज़ॉल्यूशन 640x480F30) का चयन करने के लिए स्वतंत्र है। और जैसा कि पहले से ही पिछले भाग में बताया गया है, डेप्थरेन्ज एन्यूमरेशन द्वारा परिभाषित "वर्किंग" डिस्टेंस: डिफॉल्ट रेंज और नियर रेंज की दो रेंज हैं।

 //    kinect.DepthStream.Range = DepthRange.Near; //       640x480(30fps) kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30); 


लेकिन यह सब नहीं है। तथ्य यह है कि प्रत्येक पिक्सेल में दूरी मूल्य केवल 13 बिट्स के साथ एन्कोडेड है, और 3 बिट्स का उद्देश्य किसी व्यक्ति की पहचान करना है। यदि ऑब्जेक्ट की दूरी ऑपरेटिंग रेंज के बाहर है (डिफ़ॉल्ट और नियर रेंज याद रखें?), शून्य या एक निश्चित स्थिरांक 13 बिट्स में वापस आ जाएगा। यदि आप सेंसर को इनिशियलाइज़ करते समय एक मानव आकृति की ट्रैकिंग सक्षम करते हैं, तो पता चला व्यक्ति का सीरियल नंबर (1 या 2) 3 बिट्स में वापस आ जाएगा (यदि कोई व्यक्ति इस बिंदु पर पाया जाता है, अन्यथा 0 वापस आ जाएगा):

 kinect.SkeletonStream.Enable(); 


तो, आप और मैं पहले Kinect फीचर के करीब आए हैं, जिस पर हम विचार करेंगे, अर्थात् मानव आकृति की ट्रैकिंग (कंकाल ट्रैकिंग)

Source: https://habr.com/ru/post/In151131/


All Articles