Я пытаюсь написать процедуру, которая берет UIImage и возвращает новый UIImage, который содержит только лицо. Это казалось бы очень простым, но у моего мозга возникают проблемы, связанные с пространствами CoreImage и UIImage.Обнаружение лица 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, есть ли «правильный» способ сделать это?
Спасибо!
Я изучаю то же самое, не могли бы вы объяснить расчет, который вы выполнили для оси y, пожалуйста ?. А что такое «большая поверхность»? –