Проблема с обнаружением лиц iOS

Я пытаюсь использовать обнаружение лица 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];
}

Это компилируется и работает отлично, но массив признаков всегда пуст, независимо от того, что на картинке... Любые идеи?

Ответ 1

Я не могу ответить на ваш комментарий @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 В примере есть целая куча полезных методов, чтобы выяснить, в какой ориентации вы находитесь, если вам нужно, чтобы динамически определить вашу ориентацию.

Ответ 2

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

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

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

NSArray *features = [faceDetector featuresInImage:ciImage];

Еще одна большая вещь, которую я заметил, заключается в том, что обнаружение лица из неподвижного изображения на самом деле не работает на изображении с низким разрешением с передней камеры! Он работает каждый раз, когда я использую заднюю камеру высокого разрешения. Возможно, алгоритм настроен для высокого разрешения...

Ответ 3

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

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

            }

Ответ 4

Ни один из ответов выше не работал у меня (iOS 8.4) iPad Mini и iPad Air 2

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

let ciImage = CIImage (CVPixelBuffer: pixelBuffer, опции: вложения) угол = CGFloat (-M_PI/2) let rotatedImage = ciImage.imageByApplyingTransform(CGAffineTransformMakeRotation (угол))