2015-01-09 8 views
6

मैं वर्तमान में विंडोज 8.1 पर विंडोज एसडीके 2 के लिए माइक्रोसॉफ्ट किनेक्ट के साथ प्रोग्रामिंग कर रहा हूं। चीजें अच्छी तरह से चल रही हैं, और घर देव वातावरण में स्पष्ट रूप से 'असली दुनिया' की तुलना में पृष्ठभूमि में ज्यादा शोर नहीं है।माइक्रोसॉफ्ट किनेक्ट और पृष्ठभूमि/पर्यावरण शोर

मैं किनेक्ट के साथ 'वास्तविक दुनिया' अनुप्रयोगों में अनुभव वाले लोगों से कुछ सलाह लेना चाहता हूं। पृष्ठभूमि में पासर्स द्वारा, दर्शक और अप्रत्याशित वस्तुओं के साथ एक जीवंत वातावरण में Kinect (विशेष रूप से v2) किराया कैसे करता है? मुझे उम्मीद है कि, किनेक्ट सेंसर से उपयोगकर्ता में अंतरिक्ष में आमतौर पर हस्तक्षेप नहीं होगा - हालांकि, मैं इस बारे में बहुत सावधान हूं कि पृष्ठभूमि शोर इस प्रकार है।

जबकि मुझे पता है कि किनेक्ट सीधे सूर्य की रोशनी (या तो सेंसर या उपयोगकर्ता पर) के नीचे अच्छी तरह से ट्रैक नहीं करता है - क्या कुछ प्रकाश व्यवस्था या अन्य बाहरी कारक हैं जिन्हें मुझे कोड में कारक करने की आवश्यकता है?

जवाब मैं देख रहा हूँ है:

  1. मुद्दों किस तरह एक जीवित वातावरण में पैदा कर सकते हैं?
  2. आपने अपने आस-पास अपना कोड कैसे बनाया या काम किया?
+0

मुझे दूसरा प्रश्न नहीं मिला। – GLHF

+1

@howaboutNO पृष्ठभूमि शोर पूरी तरह से एक हार्डवेयर मुद्दा है? या कोड कोड पर कुछ ऐसा किया जा सकता है? क्या एसडीके बेहतर ट्रैकिंग के लिए अनुमति नहीं देता है? –

उत्तर

4

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

  1. "मानव" की वैधता की जांच करने की स्थितियां हैं।

    जब मैंने कई अन्य ऑब्जेक्ट्स और प्रोप के साथ एक प्रस्तुति मंजिल के बीच में अपना आवेदन दिखाया, तो मैंने पाया कि यहां तक ​​कि कुर्सियों को संक्षिप्त क्षणों के लिए भी गलती की जा सकती है, जिससे उपयोगकर्ता के बीच मेरा एप्लिकेशन स्विचिंग हो जाता है और एक निर्जीव वस्तु , जिससे उपयोगकर्ता का ट्रैक खो गया और उनकी प्रगति खो गई। इस या अन्य झूठी सकारात्मक मानव detections का मुकाबला करने के लिए, मैंने एक मानव के लिए अपने स्वयं के अतिरिक्त चेक जोड़ा। मेरी सबसे सफल विधि मानव शरीर के अनुपात की तुलना कर रही थी। मैंने इसे मुख्य इकाइयों में मापा। (head units picture) नीचे कैसे मैं इस (SDK संस्करण 1.8, सी #) किया कोड

    bool PersonDetected = false; 
    double[] humanRatios = { 1.0f, 4.0, 2.33, 3.0 }; 
    /*Array indexes 
    * 0 - Head (shoulder to head) 
    * 1 - Leg length (foot to knee to hip) 
    * 2 - Width (shoulder to shoulder center to shoulder) 
    * 3 - Torso (hips to shoulder) 
    */ 
    
    .... 
    
    double[] currentRatios = new double[4]; 
    double headSize = Distance(skeletons[0].Joints[JointType.ShoulderCenter], skeletons[0].Joints[JointType.Head]); 
    
    currentRatios[0] = 1.0f; 
    
    currentRatios[1] = (Distance(skeletons[0].Joints[JointType.FootLeft], skeletons[0].Joints[JointType.KneeLeft]) + Distance(skeletons[0].Joints[JointType.KneeLeft], skeletons[0].Joints[JointType.HipLeft]))/headSize; 
    
    currentRatios[2] = (Distance(skeletons[0].Joints[JointType.ShoulderLeft], skeletons[0].Joints[JointType.ShoulderCenter]) + Distance(skeletons[0].Joints[JointType.ShoulderCenter], skeletons[0].Joints[JointType.ShoulderRight]))/headSize; 
    
    currentRatios[3] = Distance(skeletons[0].Joints[JointType.HipCenter], skeletons[0].Joints[JointType.ShoulderCenter])/headSize; 
    
    int correctProportions = 0; 
    
    for (int i = 1; i < currentRatios.Length; i++) 
    { 
        diff = currentRatios[i] - humanRatios[i]; 
    
        if (abs(diff) <= MaximumDiff)//I used .2 for my MaximumDiff 
         correctProportions++; 
    } 
    
    if (correctProportions >= 2) 
        PersonDetected = true; 
    

    एक अन्य विधि मैं जोड़ों दूरी की राशि की औसत खोजने गया था के साथ सफलता मिली एक दूसरे से चुकता है। मैंने पाया कि गैर-मानवीय विचलनों में अधिक परिवर्तनीय दूरी होती है, जबकि मनुष्य अधिक सुसंगत होते हैं। औसत मैं एक एकल आयामी समर्थन वेक्टर मशीन का उपयोग कर सीखा (मैंने पाया उपयोगकर्ता के अभिव्यक्त दूरी आम तौर पर 9 की तुलना में कम थे)

    //in AllFramesReady or SkeletalFrameReady 
    Skeleton data; 
    
    ... 
    
    float lastPosX = 0; // trying to detect false-positives 
    float lastPosY = 0; 
    float lastPosZ = 0; 
    float diff = 0; 
    foreach (Joint joint in data.Joints) 
    { 
        //add the distance squared 
        diff += (joint.Position.X - lastPosX) * (joint.Position.X - lastPosX); 
        diff += (joint.Position.Y - lastPosY) * (joint.Position.Y - lastPosY); 
        diff += (joint.Position.Z - lastPosZ) * (joint.Position.Z - lastPosZ); 
        lastPosX = joint.Position.X; 
        lastPosY = joint.Position.Y; 
        lastPosZ = joint.Position.Z; 
    } 
    
    if (diff < 9)//this is what my svm learned 
        PersonDetected = true; 
    
  2. उपयोग खिलाड़ी आईडी और अनुक्रमित जो याद करने के लिए किया जाता है, जो

    साथ में यह संबंधों पिछली समस्या, जहां किनेक्ट ने दो उपयोगकर्ताओं को स्विच किया था कि यह दूसरों को ट्रैक कर रहा था, तो डेटा में अचानक परिवर्तनों के कारण मेरा आवेदन क्रैश हो जाएगा। इसका मुकाबला करने के लिए, मैं प्रत्येक खिलाड़ी के कंकाल इंडेक्स और उनके प्लेयर आईडी दोनों का ट्रैक रखूंगा। मैंने यह कैसे किया है इसके बारे में और जानने के लिए, Kinect user Detection देखें।

  3. बदलती स्थितियों

    मैं कहां से पेश किया गया था, एक ही झुकाव कोण और अन्य बुनियादी Kinect मानकों (पास-मोड) की तरह नए माहौल में काम नहीं किया करने के लिए अपनाने के लिए समायोज्य पैरामीटर जोड़ें। उपयोगकर्ता को इन पैरामीटर में से कुछ को समायोजित करने में सक्षम होने दें ताकि वे नौकरी के लिए सबसे अच्छा सेटअप प्राप्त कर सकें।

  4. की अपेक्षा लोग बेवकूफ बातें

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

    int motorAdjustments = 0; 
    DateTime firstAdjustment; 
    
    ... 
    
    //in motor adjustment code 
    if (motorAdjustments == 0) 
        firstAdjustment = DateTime.Now; 
    ++motorAdjustments; 
    
    if (motorAdjustments < 20) 
    { 
        //adjust the tilt 
    } 
    
    else 
    { 
        DateTime timeCheck = firstAdjustment; 
    
        if (DateTime.Now > timeCheck.AddMinutes(2)) 
        { 
         //reset all variables 
         motorAdjustments = 1; 
         firstAdjustment = DateTime.Now; 
    
         //adjust the tilt 
        } 
    } 
    

    मैं ध्यान दें होता है कि इन सभी Kinect के पहले संस्करण के साथ मेरे लिए मुद्दे थे, और मैं नहीं जानता कि उनमें से कितने दूसरे संस्करण में सुलझाई जा सकती जैसा कि मैंने दुर्भाग्य से नहीं मिला है मेरी अभी तक एक हाथ हालांकि मैं अभी भी इन तकनीकों में से कुछ को कार्यान्वित करता हूं यदि बैक-अप तकनीक नहीं है क्योंकि अपवाद होंगे, खासकर कंप्यूटर दृष्टि में।

+0

बहुत अच्छी अंतर्दृष्टि - धन्यवाद। –

+0

@ फ्रैंकिसकिम कोई समस्या नहीं! यदि आप चाहते हैं कि मैं उपयोगकर्ता भेद के लिए कोड के कुछ उदाहरण पोस्ट कर सकता हूं, हालांकि यह पुराने एसडीके संस्करण होंगे ... –

+0

हां, किसी भी प्रकार के कोड संदर्भ की बहुत सराहना की जाती है। –

5

आउटलेट लेमूर ने वास्तविक दुनिया परिदृश्यों में आपको जिन मुद्दों का सामना करना पड़ सकता है, उनमें विस्तार से विस्तार किया है।

विंडोज संस्करण 2 के लिए किनेक्ट का उपयोग करके, आपको मोटर को समायोजित करने की आवश्यकता नहीं है, क्योंकि कोई मोटर नहीं है और सेंसर का दृश्य बड़ा क्षेत्र है। यह आपके जीवन को अधिक आसान बना देगा।

मैं निम्नलिखित सुझाव और सलाह जोड़ना चाहते हैं:

1) प्रत्यक्ष प्रकाश (शारीरिक या आंतरिक प्रकाश)

Kinect एक अवरक्त संवेदक कि भ्रमित हो सकता है से बचें। इस सेंसर को किसी भी प्रकाश स्रोत के साथ सीधा संपर्क नहीं होना चाहिए। आप साधारण लेजर पॉइंटर और मशाल के साथ खेलकर अपने घर/कार्यालय में ऐसे माहौल का अनुकरण कर सकते हैं।

2) आप केवल एक ही व्यक्ति पर नज़र रखने रहे हैं, तो सबसे करीब ट्रैक किए गए उपयोगकर्ता

चयन आपका ऐप्लिकेशन केवल एक खिलाड़ी की जरूरत है, यह है कि खिलाड़ी एक) पूरी तरह से नज़र रखी होने की जरूरत है और ख) की तुलना में सेंसर के करीब दूसरे। प्रतिभागियों को यह समझने का एक आसान तरीका है कि आपके यूआई को और अधिक जटिल बनाये बिना ट्रैक किया गया है।

public static Body Default(this IEnumerable<Body> bodies) 
    { 
     Body result = null; 
     double closestBodyDistance = double.MaxValue; 

     foreach (var body in bodies) 
     { 
      if (body.IsTracked) 
      { 
       var position = body.Joints[JointType.SpineBase].Position; 
       var distance = position.Length(); 

       if (result == null || distance < closestBodyDistance) 
       { 
        result = body; 
        closestBodyDistance = distance; 
       } 
      } 
     } 

     return result; 
    } 

3) विभिन्न खिलाड़ियों

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

ulong _trackinfID1 = 0; 
    ulong _trackingID2 = 0; 

    void BodyReader_FrameArrived(object sender, BodyFrameArrivedEventArgs e) 
    { 
     using (var frame = e.FrameReference.AcquireFrame()) 
     { 
      if (frame != null) 
      { 
       frame.GetAndRefreshBodyData(_bodies); 

       var bodies = _bodies.Where(b => b.IsTracked).ToList(); 

       if (bodies != null && bodies.Count >= 2 && _trackinfID1 == 0 && _trackingID2 == 0) 
       { 
        _trackinfID1 = bodies[0].TrackingId; 
        _trackingID2 = bodies[1].TrackingId; 

        // Alternatively, specidy body1 and body2 according to their distance from the sensor. 
       } 

       Body first = bodies.Where(b => b.TrackingId == _trackinfID1).FirstOrDefault(); 
       Body second = bodies.Where(b => b.TrackingId == _trackingID2).FirstOrDefault(); 

       if (first != null) 
       { 
        // Do something... 
       } 

       if (second != null) 
       { 
        // Do something... 
       } 
      } 
     } 
    } 

4) प्रदर्शन चेतावनी एक खिलाड़ी बहुत दूर या बहुत सेंसर के करीब है जब।

उच्च सटीकता प्राप्त करने के लिए, खिलाड़ियों को एक विशिष्ट दूरी पर खड़े होने की आवश्यकता है: सेंसर के बहुत दूर या बहुत करीब नहीं। यह इस तरह लगाया जाए:

const double MIN_DISTANCE = 1.0; // in meters 
const double MAX_DISTANCE = 4.0; // in meters 

double distance = body.Joints[JointType.SpineBase].Position.Z; // in meters, too 

if (distance > MAX_DISTANCE) 
{ 
    // Prompt the player to move closer. 
} 
else if (distance < MIN_DISTANCE) 
{ 
    // Prompt the player to move farther. 
} 
else 
{ 
    // Player is in the right distance. 
} 

5) हमेशा यह जानें कि जब एक खिलाड़ी डाल देते हैं या दृश्य छोड़ दिया है।

विटरुवियस समझने का एक आसान तरीका प्रदान करता है जब किसी ने दृश्य में प्रवेश किया या छोड़ा। अगर कोई खिलाड़ी आसपास के बहुत से लोगों को कर रहे हैं

UsersController userReporter = new UsersController(); 
    userReporter.BodyEntered += UserReporter_BodyEntered; 
    userReporter.BodyLeft += UserReporter_BodyLeft; 
    userReporter.Start(); 

    void UserReporter_BodyEntered(object sender, UsersControllerEventArgs e) 
    { 
     // A new user has entered the scene. Get the ID from e param. 
    } 

    void UserReporter_BodyLeft(object sender, UsersControllerEventArgs e) 
    { 
     // A user has left the scene. Get the ID from e param. 
    } 

6) एक दृश्य सुराग जिनमें से खिलाड़ी को ट्रैक करता है

है:

Here is the source code और यहाँ आपके ऐप्लिकेशन में इसका इस्तेमाल करने के लिए है , आपको ट्रैक किए जाने वाले ऑन-स्क्रीन को दिखाने की आवश्यकता हो सकती है। आप गहराई फ्रेम बिटमैप को हाइलाइट कर सकते हैं या माइक्रोसॉफ्ट के किनेक्ट इंटरैक्शन का उपयोग कर सकते हैं।

This is an example of removing the background and keeping the player pixels only

7) से बचें चमकदार फर्श

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

+1

वाह मुझे चमकदार मंजिल की चीज़ के बारे में पता नहीं था ... +1 –

+3

दरअसल, अगर मंजिल बहुत चमकदार है, तो किनेक्ट आपके पैरों को प्रतिबिंबित शरीर में बढ़ा सकता है। – Vangos

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