UIImage обнаружение лица - PullRequest
       15

UIImage обнаружение лица

8 голосов
/ 23 февраля 2012

Я пытаюсь написать процедуру, которая принимает UIImage и возвращает новый UIImage, который содержит только лицо.Это может показаться очень простым, но у моего мозга возникают проблемы с обходом пространства CoreImage и UIImage.

Вот основы:

- (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect {
    CGImageRef sourceImageRef = [image CGImage];
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    CGImageRelease(newImageRef);
    return newImage;
}


-(UIImage *)getFaceImage:(UIImage *)picture {
  CIDetector  *detector = [CIDetector detectorOfType:CIDetectorTypeFace 
                                             context:nil 
                                             options:[NSDictionary dictionaryWithObject: CIDetectorAccuracyHigh forKey: CIDetectorAccuracy]];

  CIImage *ciImage = [CIImage imageWithCGImage: [picture CGImage]];
  NSArray *features = [detector featuresInImage:ciImage];

  // For simplicity, I'm grabbing the first one in this code sample,
  // and we can all pretend that the photo has one face for sure. :-)
  CIFaceFeature *faceFeature = [features objectAtIndex:0];

  return imageFromImage:picture inRect:faceFeature.bounds;
}

Изображение, которое возвращается изперевернутое изображение.Я попытался настроить faceFeature.bounds, используя что-то вроде этого:

CGAffineTransform t = CGAffineTransformMakeScale(1.0f,-1.0f);
CGRect newRect = CGRectApplyAffineTransform(faceFeature.bounds,t);

... но это дает мне результаты вне изображения.

Я уверен, что есть что-то простое, чтобы это исправить, но если не считать вычисления снизу-вниз и затем создать новый прямоугольник, используя его в качестве X, есть ли «правильный» способ сделать это?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 02 июля 2013

Гораздо проще и менее грязно просто использовать CIContext, чтобы обрезать свое лицо на изображении.Примерно так:

CGImageRef cgImage = [_ciContext createCGImage:[CIImage imageWithCGImage:inputImage.CGImage] fromRect:faceFeature.bounds];
UIImage *croppedFace = [UIImage imageWithCGImage:cgImage];

Где inputImage - это ваш объект UIImage, а faceFeature объект имеет тип CIFaceFeature, полученный из [CIDetector featuresInImage:] метод.

3 голосов
/ 24 февраля 2012

Поскольку, кажется, простого способа сделать это не существует, я просто написал код для этого:

CGRect newBounds = CGRectMake(faceFeature.bounds.origin.x, 
                              _picture.size.height - faceFeature.bounds.origin.y - largestFace.bounds.size.height, 
                              faceFeature.bounds.size.width, 
                              faceFeature.bounds.size.height);

Это сработало.

0 голосов
/ 24 февраля 2012

Нет простого способа добиться этого, проблема в том, что изображения с камеры iPhone всегда находятся в портретном режиме, а настройки метаданных используются для их правильного отображения.Вы также получите лучшую точность при вызове по распознаванию лиц, если заранее сообщите поворот изображения.Просто чтобы усложнить ситуацию, вы должны передать ей ориентацию изображения в формате EXIF.

К счастью, есть пример проекта Apple, который охватывает все это и называется Squarecam , я предлагаю вам проверить егодля деталей

...