2012-06-29 15 views
10

के साथ चेहरे की पहचान हाल ही में मैं नए डेवलपर टूलकिट (v1.5.1) का उपयोग करके किनेक्ट के साथ चेहरे की पहचान करने की कोशिश करने पर काम कर रहा हूं। फेसट्रैकिंग टूल्स के लिए एपीआई यहां पाया जा सकता है: http://msdn.microsoft.com/en-us/library/jj130970.aspx। असल में मैंने जो करने की कोशिश की है वह प्रत्येक व्यक्ति के लिए "चेहरे का हस्ताक्षर" अद्वितीय है। ऐसा करने के लिए, मैंने इन चेहरे के अंक कोनेक्ट ट्रैक का संदर्भ दिया: (http://i.msdn.microsoft.com/dynimg/IC584330.png)।किनेक्ट

फिर मैंने अपने चेहरे (साथ ही कुछ दोस्तों) को ट्रैक किया और मूल बीजगणित का उपयोग करके 39 और 8 के बीच की दूरी की गणना की। मैंने सिर की वर्तमान गहराई के लिए मूल्य भी प्राप्त किए। मेरे द्वारा प्राप्त किए गए डेटा का नमूना है:

DISTANCE FROM RIGHT SIDE OF NOSE TO LEFT EYE: 10.1919198899636 
CURRENT DEPTH OF HEAD: 1.65177881717682 
DISTANCE FROM RIGHT SIDE OF NOSE TO LEFT EYE: 11.0429381713623 
CURRENT DEPTH OF HEAD: 1.65189981460571 
DISTANCE FROM RIGHT SIDE OF NOSE TO LEFT EYE: 11.0023324541865 
CURRENT DEPTH OF HEAD: 1.65261101722717 

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

मेरा लक्ष्य लोगों को पहचानने में सक्षम होना है क्योंकि वे कमरे में प्रवेश करते हैं, अपनी "प्रोफ़ाइल" को सहेजते हैं, और फिर बाहर निकलने के बाद इसे हटा देते हैं। क्षमा करें अगर यह थोड़ा सा था, लेकिन मैं अभी तक की गई प्रगति को समझाने की कोशिश कर रहा हूं। तो, आप लोग क्या सोचते हैं कि मैं चेहरे की पहचान कैसे कार्यान्वित कर सकता हूं? किसी भी विचार/मदद की सराहना की जाएगी।

+1

कृपया कुछ कोड/यहां तक ​​कि आप किस बीजगणित का उपयोग कर रहे थे, और –

उत्तर

4

यदि आप EnumIndexableCollection<FeaturePoint, PointF> का उपयोग करते हैं, तो आप FaceTrackFrame की GetProjected3DShape() विधि का उपयोग कर सकते हैं। आप इसे इस तरह का उपयोग करें:

private byte[] colorImage; 

    private ColorImageFormat colorImageFormat = ColorImageFormat.Undefined; 

    private short[] depthImage; 

    private DepthImageFormat depthImageFormat = DepthImageFormat.Undefined; 

    KinectSensor Kinect = KinectSensor.KinectSensors[0]; 

    private Skeleton[] skeletonData; 

    colorImageFrame = allFramesReadyEventArgs.OpenColorImageFrame(); 
    depthImageFrame = allFramesReadyEventArgs.OpenDepthImageFrame(); 
    skeletonFrame = allFramesReadyEventArgs.OpenSkeletonFrame(); 
    colorImageFrame.CopyPixelDataTo(this.colorImage); 
    depthImageFrame.CopyPixelDataTo(this.depthImage); 
    skeletonFrame.CopySkeletonDataTo(this.skeletonData); 
    skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength]; 

    foreach(Skeleton skeletonOfInterest in skeletonData) 
    { 
     FaceTrackFrame frame = faceTracker.Track(
      colorImageFormat, colorImage, depthImageFormat, depthImage, skeletonOfInterest); 
    } 

    private EnumIndexableCollection<FeaturePoint, PointF> facePoints = frame.GetProjected3DShape(); 

तो आप अपनी छवि में अंक में से प्रत्येक का उपयोग कर सकते हैं। मैं एक const double preferedDistance कि आप वर्तमान गहराई और एक्स और विभिन्न बिंदुओं के y गुणा कर सकते हैं सूत्र द्वारा की x और y के पसंदीदा संस्करण और गहराई को खोजने के लिए होता है

preferredDistance/currentDistance

उदाहरण:

 const double preferredDistance = 500.0;//this can be any number you want. 

     double currentDistance = //however you are calculating the distance 

     double whatToMultiply = preferredDistance/currentDistance; 

     double x1 = this.facePoints[39].X; 
     double y1 = this.facePoints[39].Y; 
     double x2 = this.facePoints[8].X; 
     double y2 = this.facePoints[8].Y; 

     double result = whatToMultiply * //however you are calculating distance. 

तो फिर तुम दूरी खोज करने के लिए कर रहे हैं क्या की एक List<> हो सकता है। मैं यह भी सुझाव दूंगा कि आपके पास List<> बूल है जो दूरी पर कोरिसपॉन्ड परिणाम के लिए सही होने पर सत्य पर सेट करने के लिए दूरी है, ताकि आप ट्रैक कर सकें कि बूल सत्य/गलत है।
उदाहरण:

 List<double> DistanceFromEyeToNose = new List<double> 
     { 
      1, 
      2, 
      3 //etc 
     }; 


     List<bool> IsMatch = new List<bool> 
     { 
      false, 
      false, 
      false //etc 
     }; 

फिर एक for पाश का उपयोग करके इसे खोज करते हैं।

 for (int i = 0; i < DistanceFromEyeToNose.Count; i++) 
     { 
      if (result == DistanceFromEyeToNose[i]) IsMatch[i] = true; 
     } 

आशा है कि इससे मदद मिलती है!

+0

दूरी के आलेख एक अच्छा विचार की तरह लगता है, मैं इसे देख लूंगा। – Ray

+2

@ रे अगर यह आपके प्रश्न का उत्तर देता है, तो –

+0

स्वीकार करें अभी भी काम में ... मैं किनेक्ट की चेहरे की पहचान क्षमताओं पर संदेह करना शुरू कर रहा हूं। – Ray

0

आपके द्वारा संलग्न तस्वीर 2 डी मॉडल को संदर्भित करती है। GetProjected3DShape के पास तस्वीर के साथ कुछ लेना देना नहीं है।

2 डी फेस पॉइंट प्राप्त करने के लिए IFTResult.Get2DShapePoints का उपयोग करें। यदि आप FaceTrackingBasics-WPF उदाहरण का उपयोग कर रहे हैं, तो आपको उस विधि के लिए सी # रैपर लिखना होगा।

+0

स्वीकार करें यह मेरा [रैपर Get2DShapePoints] के लिए है (https://gist.github.com/OndroNR/ed20afdd6b1a62efa1a8#file-facetrackframe-cs) –

0

मैं अपने मास्टर की डिग्री के लिए इस तरह की एक परियोजना पर काम कर रहा हूं और मैं महलानोबिस दूरी का उपयोग कर दूरी की गणना कर रहा हूं जो स्केल-इनवेरिएंट है। यहां सूत्र है: डी (एक्स, वाई) = वर्ग (पॉव ((शी-यी), 2)/पॉव (सी, 2)); I: 1 -> एन, जहां सी नमूना सेट पर शी और यी का मानक विचलन है। यहां विकिपीडिया लिंक है: http://en.wikipedia.org/wiki/Mahalanobis_distance

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