4

Я хочу добавить метрику между двумя точками на лице, чтобы использовать ее для обнаружения объектов в цифровых изображениях, мы ограничиваем ее два измерения, как показано нижеКак добавить метрику между двумя точками на лице, чтобы использовать ее для обнаружения объекта в цифровых изображениях для распознавания лиц

Я мог recoginze черты лица, как показано ниже изображения с помощью:

-(void)markFaces:(UIImageView *)facePicture 
{ 
    // draw a CI image with the previously loaded face detection picture 
    CIImage* image = [CIImage imageWithCGImage:facePicture.image.CGImage]; 

    // create a face detector - since speed is not an issue we'll use a high accuracy 
    // detector 
    CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace 
              context:nil options:  [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]]; 

    // create an array containing all the detected faces from the detector 
    NSArray* features = [detector featuresInImage:image]; 

    // we'll iterate through every detected face. CIFaceFeature provides us 
    // with the width for the entire face, and the coordinates of each eye 
    // and the mouth if detected. Also provided are BOOL's for the eye's and 
    // mouth so we can check if they already exist. 
    for(CIFaceFeature* faceFeature in features) 
    { 
     // get the width of the face 
     CGFloat faceWidth = faceFeature.bounds.size.width; 

     // create a UIView using the bounds of the face 
     UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds]; 

     // add a border around the newly created UIView 
     faceView.layer.borderWidth = 1; 
     faceView.layer.borderColor = [[UIColor redColor] CGColor]; 

     // add the new view to create a box around the face 
    [self.view addSubview:faceView]; 

     if(faceFeature.hasLeftEyePosition) 
     { 
      // create a UIView with a size based on the width of the face 
      UIView* leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.leftEyePosition.x-faceWidth*0.15, faceFeature.leftEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)]; 
      // change the background color of the eye view 
      [leftEyeView setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]]; 
      // set the position of the leftEyeView based on the face 
      [leftEyeView setCenter:faceFeature.leftEyePosition]; 

      // round the corners 
      leftEyeView.layer.cornerRadius = faceWidth*0.15; 
      // add the view to the window 
      [self.view addSubview:leftEyeView]; 
     } 

     if(faceFeature.hasRightEyePosition) 
     { 
      // create a UIView with a size based on the width of the face 
      UIView* leftEye = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.rightEyePosition.x-faceWidth*0.15, faceFeature.rightEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)]; 
      // change the background color of the eye view 
      [leftEye setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]]; 
      // set the position of the rightEyeView based on the face 
      [leftEye setCenter:faceFeature.rightEyePosition]; 
      // round the corners 
      leftEye.layer.cornerRadius = faceWidth*0.15; 
      // add the new view to the window 
      [self.view addSubview:leftEye]; 
     }  

     if(faceFeature.hasMouthPosition) 
     { 
      // create a UIView with a size based on the width of the face 
      UIView* mouth = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.mouthPosition.x-faceWidth*0.2, faceFeature.mouthPosition.y-faceWidth*0.2, faceWidth*0.4, faceWidth*0.4)]; 
      // change the background color for the mouth to green 
      [mouth setBackgroundColor:[[UIColor greenColor] colorWithAlphaComponent:0.3]]; 

      // set the position of the mouthView based on the face 
      [mouth setCenter:faceFeature.mouthPosition]; 

       // round the corners 
      mouth.layer.cornerRadius = faceWidth*0.2; 

      // add the new view to the window 
      [self.view addSubview:mouth]; 
       } 
      } 
     } 

     -(void)faceDetector 
     { 
      // Load the picture for face detection 
      //UIImageView* image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"facedetectionpic.jpg"]]; 
      UIImageView* image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"timthumb.png"]]; 
      // Draw the face detection image 
      [self.view addSubview:image]; 

      // Execute the method used to markFaces in background 
      [self performSelectorInBackground:@selector(markFaces:) withObject:image]; 

      // flip image on y-axis to match coordinate system used by core image 
      [image setTransform:CGAffineTransformMakeScale(1, -1)]; 

      // flip the entire window to make everything right side up 
      [self.view setTransform:CGAffineTransformMakeScale(1, -1)]; 


     } 

Теперь я хочу добавить точки, чтобы найти Приложите глаз, носа и т.д. перед загрузкой в ​​базу данных. Позже эти изображения можно сравнить с существующими изображений на основе этих метрическую положение точки, как показано ниже

enter image description hereenter image description here

я говорил This Link, но не смог реализовать этот кто-нибудь знает, что это ..если пожалуйста Предложите мне

Спасибо

ответ

7

Я боюсь, что это не просто. Глядя на документацию, CIDetector не включает в себя детекторы для дополнительных наземных ориентиров. Вам нужно будет обучить себя на наборе ручных аннотированных изображений. Для этого есть несколько проектов с открытым исходным кодом. Очень хороший (точный и быстрый) - это dlib: http://blog.dlib.net/2014/08/real-time-face-pose-estimation.html

+0

Благодарим за отзыв. Но я хочу реализовать это с помощью цели c – Sujania

+0

dlib - это библиотека C++, но вы все равно можете вызвать ее в своем коде Objective C (http://www.drdobbs.com/cpp/interoperating-between-c-and-objective-c/240165502). –