2012-02-02 5 views
10

Sto cercando di utilizzare il rilevamento dei volti di CoreImage in iOS 5 ma non rileva nulla. Sto cercando di rilevare i volti in un'immagine che è stato appena catturato dalla fotocamera utilizzando questo codice:Problema rilevamento Face iOS

- (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]; 
} 

Questo compila e funziona bene, ma la matrice caratteristiche è sempre vuota indipendentemente da ciò che è nell'immagine ... Qualsiasi idee?

risposta

22

Non posso rispondere al tuo @ 14: 52 commentare direttamente Vic320, ma sono stato a giocare con la fotocamera frontale per il rilevamento del viso - Io sono andato e giro in tondo poiché non riuscivo a ottenere la fotocamera anteriore per riprendere il mio viso ...

Risulta che è molto sensibile alla rotazione - Ho notato che quando si tiene il mio iPad2 in verticale (come ti aspetteresti mentre utilizzando la fotocamera anteriore) Avevo meno del 10% di precisione di riconoscimento. Per un capriccio, lo girò di lato e ricevette il riconoscimento del 100% con la fotocamera anteriore.

correzione semplice per questo se si sta utilizzando la fotocamera frontale sempre in verticale è quello di aggiungere questo piccolo frammento:

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

che 6 in là costringe il rilevatore di operare in modalità verticale. Il campione SquareCam di Apple ha un sacco di metodi di utilità per capire in che direzione ti trovi se ne hai bisogno per capire in modo dinamico il tuo orientamento.

+0

Ancora attuale oggi! Assolutamente brillante –

5

OK, è sempre utile leggere la documentazione ATTENTAMENTE. Nei documenti UIImage, sotto la proprietà CIImage si dice: "Se l'oggetto UIImage è stato inizializzato usando un CGImageRef, il valore della proprietà è nullo." Apparentemente, UIImagePickerController inizializza l'immagine da un CGImageRef perché questa proprietà è effettivamente nulla. Per far funzionare il codice di cui sopra, è necessario aggiungere:

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

e cambiare questa linea:

NSArray *features = [faceDetector featuresInImage:ciImage]; 

Un'altra grande cosa che ho notato è che il rilevamento del viso da un fermo immagine in realtà non lavorare sulla immagine a bassa risoluzione dalla fotocamera anteriore! Funziona ogni volta che uso la fotocamera posteriore, ad alta risoluzione. Forse l'algoritmo è ottimizzato per l'alta risoluzione ...

+0

Grazie mille. –

4

Prova a seguire. Supponendo che si carica foto nella variabile immagine:

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

Nessuna delle risposte sopra ha funzionato per me (iOS 8.4) Mini iPad & iPad Air 2

ho avuto la stessa osservazione come robwormald. Face detection funzionato quando è stato ruotato iPad, così ho ruotato la ciImage :)

lasciare ciImage = CIImage (CVPixelBuffer: pixelBuffer, opzioni: allegati) angolo let = CGFloat (-M_PI/2) lasciare rotatedImage = ciImage.imageByApplyingTransform (CGAffineTransformMakeRotation (angolo))