2012-06-29 56 views
10

Gần đây tôi đã cố gắng thử nhận diện khuôn mặt với Kinect, sử dụng Bộ công cụ phát triển mới (v1.5.1). Bạn có thể tìm thấy API cho các công cụ FaceTracking tại đây: http://msdn.microsoft.com/en-us/library/jj130970.aspx. Về cơ bản những gì tôi đã cố gắng làm cho đến nay là đạt được một "chữ ký trên khuôn mặt" duy nhất cho mỗi người. Để làm điều này, tôi tham khảo những điểm trên mặt Kinect bài hát: (http://i.msdn.microsoft.com/dynimg/IC584330.png).Nhận diện khuôn mặt với Kinect

Sau đó, tôi theo dõi khuôn mặt của tôi (cộng với một vài người bạn) và tính toán khoảng cách giữa các điểm 39 và 8 bằng cách sử dụng đại số cơ bản. Tôi cũng đạt được các giá trị cho độ sâu hiện tại của đầu. Đây là mẫu dữ liệu tôi đã nhận được:

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 

Đây chỉ là một vài giá trị tôi đạt được. Vì vậy, bước tiếp theo của tôi là vẽ chúng bằng cách sử dụng excel. Kết quả mong đợi của tôi là một xu hướng rất tuyến tính giữa chiều sâu và khoảng cách. Bởi vì khi chiều sâu tăng lên, khoảng cách nên nhỏ hơn và ngược lại. Vì vậy, đối với dữ liệu của người X, xu hướng này khá tuyến tính. Nhưng đối với bạn của tôi (người Y) cốt truyện ở khắp nơi. Vì vậy, tôi đã kết luận rằng tôi không thể sử dụng phương pháp này để nhận diện khuôn mặt. Tôi không thể có được độ chính xác mà tôi cần để theo dõi một khoảng cách nhỏ như vậy.

Mục tiêu của tôi là để có thể xác định mọi người khi họ vào phòng, lưu "hồ sơ" của họ, và sau đó loại bỏ nó sau khi họ thoát. Xin lỗi nếu điều này là một chút nhiều, nhưng tôi chỉ cố gắng giải thích sự tiến bộ tôi đã thực hiện cho đến nay. SO, các bạn nghĩ gì về cách tôi có thể thực hiện nhận diện khuôn mặt? Bất kỳ ý tưởng/trợ giúp sẽ được đánh giá rất nhiều.

+1

Vui lòng thêm một số mã/ngay cả đại số bạn đang sử dụng và đồ thị của khoảng cách –

Trả lời

4

Nếu bạn sử dụng EnumIndexableCollection<FeaturePoint, PointF> để bạn có thể sử dụng phương thức GetProjected3DShape() của FaceTrackFrame. Bạn sử dụng nó như sau:

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(); 

Sau đó, bạn có thể sử dụng từng điểm trong hình ảnh của mình. tôi sẽ có một const double preferedDistance mà bạn có thể nhân sâu hiện tại và x và y trong những điểm khác nhau để tìm phiên bản ưa thích của x và y và độ sâu theo công thức

preferredDistance/currentDistance

Ví dụ:

 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. 

Sau đó, bạn có thể có một List<> những gì khoảng cách là để tìm kiếm. Tôi cũng khuyên bạn nên có một số List<> của bool coorispond đến khoảng cách để đặt thành true nếu kết quả phù hợp, vì vậy bạn có thể theo dõi trong đó bool là true/false.
Ví dụ:

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


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

Sau đó tìm kiếm nó bằng cách sử dụng một vòng lặp for.

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

Hy vọng trợ giúp này!

+0

Cảm ơn âm thanh như một ý tưởng hay, tôi sẽ xem xét điều này. – Ray

+2

@Ray Nếu điều này trả lời câu hỏi của bạn, hãy chấp nhận –

+0

Vẫn còn trong các tác phẩm ... Tôi bắt đầu nghi ngờ khả năng nhận dạng khuôn mặt của Kinect. – Ray

0

Hình ảnh bạn đính kèm đề cập đến mô hình 2D. GetProjected3DShape không liên quan gì đến hình ảnh.

Sử dụng IFTResult.Get2DShapePoints để nhận điểm mặt 2D. Nếu bạn đang sử dụng ví dụ FaceTrackingBasics-WPF, bạn phải viết trình bao bọc C# cho phương thức đó.

+0

Đây là [trình bao bọc cho Get2DShapePoints] của tôi (https://gist.github.com/OndroNR/ed20afdd6b1a62efa1a8#file-facetrackframe-cs) –

0

Tôi làm việc trên một dự án như thế này cho bằng thạc sĩ của tôi và tôi đang tính toán khoảng cách bằng cách sử dụng khoảng cách mahalanobis là quy mô bất biến. Đây là công thức: d (x, y) = sqrt (Pow ((Xi-Yi), 2)/Pow (Si, 2)); i: 1 -> N, trong đó Si là độ lệch chuẩn của Xi và Yi trên tập mẫu. Đây là liên kết wikipedia: http://en.wikipedia.org/wiki/Mahalanobis_distance

Các vấn đề liên quan