2012-02-02 12 views
10

Estoy tratando de usar la detección de rostros de CoreImage en iOS 5 pero no está detectando nada. Estoy tratando de detectar los rostros en una imagen que solo fue capturado por la cámara utilizando este código:iOS Face Detection Issue

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyHigh, CIDetectorAccuracy, nil];  
    CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; 
    NSArray *features = [faceDetector featuresInImage:image.CIImage]; 
    NSLog(@"Features = %@", features); 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Esto compila y funciona bien, pero la matriz características siempre está vacío, independientemente de lo que está en la imagen ... Cualquier ideas?

Respuesta

22

no puede responder a su @ 14: 52 comentario directamente Vic320, pero he estado jugando con la cámara frontal para la detección de rostros - Fui redonda y ronda en círculos ya que no pude hacer que la cámara frontal captara mi cara en absoluto ...

Resulta que es muy sensible a la rotación - Me di cuenta de que cuando sostengo mi iPad2 en retrato (como era de esperar usando la cámara frontal) Obtuve menos del 10% de precisión de reconocimiento. Por capricho, lo giró hacia un lado y obtuvo el 100% de reconocimiento con la cámara frontal.

solución simple para esto si usted está utilizando la cámara frontal siempre en el retrato es añadir este pequeño fragmento:

NSDictionary* imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:6] forKey:CIDetectorImageOrientation]; 
NSArray* features = [detector featuresInImage:image options:imageOptions]; 

Eso 6 en el detector se encuentra la fuerza para operar en modo vertical. La muestra de Apple SquareCam tiene un montón de métodos de utilidad para descubrir en qué orientación se encuentra si lo necesita para determinar dinámicamente su orientación.

+0

¡Sigue siendo relevante hoy! Absolutamente brillante –

5

OK, siempre es útil leer la documentación CUIDADOSAMENTE. En los documentos UIImage, bajo la propiedad CIImage, dice: "Si el objeto UIImage se inicializó utilizando un CGImageRef, el valor de la propiedad es nulo". Aparentemente, el UIImagePickerController inicializa la imagen desde un CGImageRef porque esta propiedad es de hecho nula. Para que el código anterior, es necesario agregar:

CIImage *ciImage = [CIImage imageWithCGImage:image.CGImage]; 

y cambiar esta línea:

NSArray *features = [faceDetector featuresInImage:ciImage]; 

Otra cosa GRANDE que he notado es que la detección de la cara de una imagen fija no funciona muy bien en el imagen de baja resolución de la cámara frontal! Funciona todo el tiempo cuando uso la cámara trasera de alta resolución. Tal vez el algoritmo está ajustado para alta resolución ...

+0

Muchas gracias. –

4

Intente seguir. Suponiendo que cargue la foto en la variable de la imagen:

NSDictionary *options = [NSDictionary dictionaryWithObject: CIDetectorAccuracyLow forKey: CIDetectorAccuracy]; 
      CIDetector *detector = [CIDetector detectorOfType: CIDetectorTypeFace context: nil options: options]; 

     CIImage *ciImage = [CIImage imageWithCGImage: [image CGImage]]; 
     NSNumber *orientation = [NSNumber numberWithInt:[image imageOrientation]+1]; 
     NSDictionary *fOptions = [NSDictionary dictionaryWithObject:orientation forKey: CIDetectorImageOrientation]; 
      NSArray *features = [detector featuresInImage:ciImage options:fOptions]; 
      for (CIFaceFeature *f in features) { 

       NSLog(@"left eye found: %@", (f. hasLeftEyePosition ? @"YES" : @"NO")); 

       NSLog(@"right eye found: %@", (f. hasRightEyePosition ? @"YES" : @"NO")); 

       NSLog(@"mouth found: %@", (f. hasMouthPosition ? @"YES" : @"NO")); 

       if(f.hasLeftEyePosition) 

        NSLog(@"left eye position x = %f , y = %f", f.leftEyePosition.x, f.leftEyePosition.y); 

       if(f.hasRightEyePosition) 

        NSLog(@"right eye position x = %f , y = %f", f.rightEyePosition.x, f.rightEyePosition.y); 

       if(f.hasMouthPosition) 

        NSLog(@"mouth position x = %f , y = %f", f.mouthPosition.x, f.mouthPosition.y); 

      } 
0

Ninguna de las respuestas anteriores trabajó para mí (iOS 8.4) iPad Mini iPad & aire 2

que tenía la misma observación que robwormald. detección de rostros funcionaba cuando se gira el iPad, así que gira el ciImage :)

dejar ciImage = CIImage (CVPixelBuffer: pixelBuffer, opciones: archivos adjuntos) ángulo Let = CGFloat (-M_PI/2) = dejar que rotatedImage ciImage.imageByApplyingTransform (CGAffineTransformMakeRotation (ángulo))