Проблема распознавания лиц в iOS - PullRequest
10 голосов
/ 03 февраля 2012

Я пытаюсь использовать распознавание лиц CoreImage в iOS 5, но ничего не обнаруживает. Я пытаюсь определить лица на изображении, которое было только что снято камерой, используя этот код:

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

Это компилируется и работает нормально, но массив функций всегда пуст независимо от того, что на изображении ... Есть идеи?

Ответы [ 4 ]

22 голосов
/ 08 февраля 2012

Я не могу ответить на ваш комментарий @ 14: 52 непосредственно Vic320, но я играл с фронтальной камерой для обнаружения лица - я крутился кругами, так как не мог выбрать фронтальную камеру вообще мое лицо ...

Оказывается, он очень чувствителен к вращению - я заметил, что когда я держал свой iPad2 в портретном режиме (как и следовало ожидать при использовании фронтальной камеры), я получал точность распознавания менее 10%. По своей прихоти повернул его вбок и получил 100% распознавание с фронтальной камерой.

Простое исправление для этого, если вы используете фронтальную камеру всегда в портретном режиме, это добавить этот маленький фрагмент:

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

Это 6 заставляет детектор работать в портретном режиме. В Apple SquareCam Sample есть целый ряд утилитарных методов, позволяющих выяснить, в какой вы ориентации, если вам это нужно для динамического определения вашей ориентации.

5 голосов
/ 03 февраля 2012

ОК, всегда полезно прочитать документацию ВНИМАТЕЛЬНО. В документах UIImage в свойстве CIImage говорится: «Если объект UIImage был инициализирован с использованием CGImageRef, значение свойства равно nil». По-видимому, UIImagePickerController действительно инициализирует изображение из CGImageRef, потому что это свойство действительно ноль. Чтобы приведенный выше код работал, вам нужно добавить:

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

и измените эту строку:

NSArray *features = [faceDetector featuresInImage:ciImage];

Еще одна БОЛЬШАЯ вещь, которую я заметил, - это то, что распознавание лица по неподвижному изображению не работает на изображении с низким разрешением с передней камеры! Это работает каждый раз, когда я использую заднюю камеру с высоким разрешением. Возможно, алгоритм настроен на высокое разрешение ...

4 голосов
/ 04 февраля 2012

Попробуйте следующее. Предполагается, что вы загружаете фотографию в переменную изображения:

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);

            }
1 голос
/ 11 июля 2015

Ни один из приведенных выше ответов не работал для меня (ios 8.4) ipad mini и ipad air 2

У меня было то же наблюдение, что и у робвормальда. Обнаружение лица работало, когда iPad поворачивался, поэтому я повернул ciImage:)

let ciImage = CIImage(CVPixelBuffer: pixelBuffer, options: attachments)
let angle = CGFloat(-M_PI/2)
let rotatedImage = ciImage.imageByApplyingTransform(CGAffineTransformMakeRotation(angle))
...