Проблема с обнаружением лиц 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 (угол))