2012-02-02 13 views
10

Próbuję użyć wykrywania twarzy CoreImage w iOS 5, ale nie wykrywa niczego. Próbuję wykryć twarze w obrazie, który właśnie został przechwycony przez kamerę przy użyciu tego kodu:Wykrywanie iOS wykrywania twarzy

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

To kompiluje i działa poprawnie, ale tablica funkcji jest zawsze pusty, niezależnie od tego, co znajduje się na zdjęciu ... Wszelkie pomysły?

Odpowiedz

22

Nie mogę odpowiedzieć na @ 14: 52 Komentarz bezpośrednio Vic320, ale grałem z przedniej kamery do wykrywania twarzy - Poszedłem okrągłe Okrągłe w kółko, ponieważ nie mogłem dostać przedniej kamery, żeby podnieść moją twarz ...

Wykazuje się bardzo wrażliwy na obrót - zauważyłem, że trzymając iPada2 w pozycji pionowej (jak można się spodziewać za pomocą przedniej kamery) Otrzymałem mniej niż 10% dokładności rozpoznawania. W wyniku kaprysu zwrócił go na boki i uzyskał 100% rozpoznawalności dzięki przedniej kamerze.

Proste poprawka dla tego, jeśli jesteś zawsze przy użyciu przednią kamerę w układzie pionowym jest dodanie ten mały fragment:

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

że 6 tam zmusza detektor do pracy w trybie portretowym. Apple SquareCam Próbka ma całą masę metod użytkowych, aby dowiedzieć się, w jakiej orientacji się znajdujesz, aby dynamicznie określić orientację.

+0

Nadal aktualne już dziś! Absolutnie genialny –

5

OK, zawsze warto przeczytać dokumentację ZAPOZNANIE SIĘ Z NIMI. W dokumentach UIImage pod właściwością CIImage jest napisane: "Jeśli obiekt UIImage został zainicjowany przy użyciu CGImageRef, wartość właściwości wynosi zero." Najwyraźniej UIImagePickerController inicjuje obraz z CGImageRef, ponieważ ta właściwość jest rzeczywiście zerowa. Aby powyższe prace kodu, trzeba dodać:

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

i zmienić linię:

NSArray *features = [faceDetector featuresInImage:ciImage]; 

Inną wielką rzeczą, jaką zauważyłem jest to, że wykrywanie twarzy z nieruchomego obrazu nie naprawdę działa na obraz o niskiej rozdzielczości z przedniego aparatu! Działa za każdym razem, gdy używam tylnej kamery wysokiej rozdzielczości. Być może algorytm jest dostrojony do wysokiej rozdzielczości ...

+0

Dziękuję bardzo. –

4

Spróbuj wykonać następujące czynności. Zakładając, że załadować zdjęcie w zmiennej obrazu:

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

Żadna z powyższych odpowiedzi pracował dla mnie (iOS 8.4) iPad Mini & iPad Air 2

miałem to samo spostrzeżenie jako robwormald. detekcja twarzy pracował przy IPAD obracano tak, że obraca się ciImage :)

umożliwiają ciImage = CIImage (CVPixelBuffer: pixelBuffer, opcje: osprzęt) kąt let = CGFloat (-M_PI/2) pozwolić rotatedImage = ciImage.imageByApplyingTransform (CGAffineTransformMakeRotation (kąt))

Powiązane problemy