2012-02-02 38 views
10

Tôi đang cố gắng sử dụng tính năng phát hiện khuôn mặt của CoreImage trong iOS 5 nhưng không phát hiện thấy bất kỳ điều gì. Tôi cố gắng để phát hiện khuôn mặt trong ảnh vừa được chụp bởi máy ảnh sử dụng mã này:Vấn đề phát hiện khuôn mặt 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]; 
} 

này biên dịch và chạy tốt nhưng nó các tính năng của mảng luôn là trống bất kể những gì trong hình ảnh ... Bất kỳ ý tưởng?

Trả lời

22

Tôi không thể trả lời trực tiếp 14: 52 nhận xét của bạn trực tiếp. vòng tròn trong vòng tròn vì tôi không thể lấy máy ảnh mặt trước để đón mặt mình ...

Biến nó rất nhạy cảm với xoay vòng - Tôi nhận thấy rằng khi giữ iPad2 theo chiều dọc (như bạn mong đợi trong khi sử dụng camera trước) Tôi đã nhận được độ chính xác nhận biết dưới 10%. Trên một ý thích, quay sang một bên và nhận được sự công nhận 100% với camera phía trước.

sửa chữa đơn giản cho điều này nếu bạn đang sử dụng camera phía trước luôn trong bức chân dung là thêm đoạn này chút:

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

Đó 6 trong đó buộc các máy dò để hoạt động ở chế độ dọc. Mẫu SquareCam của Apple có một loạt các phương pháp tiện ích để tìm ra định hướng bạn đang ở nếu bạn cần nó để tự động tìm ra hướng của bạn.

+0

Vẫn có liên quan ngay hôm nay! Hoàn toàn rực rỡ –

5

OK, luôn hữu ích khi đọc tài liệu CẨN THẬN. Trong tài liệu UIImage, dưới thuộc tính CIImage nó nói: "Nếu đối tượng UIImage được khởi tạo bằng CGImageRef, giá trị của thuộc tính là không." Rõ ràng, UIImagePickerController không khởi tạo hình ảnh từ CGImageRef vì thuộc tính này thực sự là không. Để thực hiện các công việc mã trên, bạn cần phải thêm:

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

và thay đổi dòng này:

NSArray *features = [faceDetector featuresInImage:ciImage]; 

Một điều BIG tôi nhận thấy là nhận diện khuôn mặt từ một hình ảnh vẫn không thực sự làm việc trên hình ảnh có độ phân giải thấp từ camera trước! Nó hoạt động mọi lúc khi tôi sử dụng máy ảnh có độ phân giải cao và ngược lại. Có lẽ thuật toán được điều chỉnh để có độ phân giải cao ...

+0

Cảm ơn bạn rất nhiều. –

4

Thử làm theo. Giả sử bạn tải ảnh trong biến hình ảnh:

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

Không ai trong số các câu trả lời ở trên làm việc cho tôi (iOS 8.4) iPad Mini & iPad Air 2

tôi đã quan sát giống như robwormald. nhận diện khuôn mặt làm việc khi iPad được luân chuyển, vì vậy tôi xoay ciImage :)

hãy ciImage = CIImage (CVPixelBuffer: pixelBuffer, lựa chọn: file đính kèm) let góc = CGFloat (-M_PI/2) hãy rotatedImage = ciImage.imageByApplyingTransform (CGAffineTransformMakeRotation (angle))

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