Estoy tratando de escribir una rutina que toma un UIImage y devuelve un nuevo UIImage que contiene solo la cara. Esto parece ser muy sencillo, pero mi cerebro está teniendo problemas para desplazarse por los espacios de CoreImage y UIImage.UIImage detección de rostros
Aquí es lo básico:
- (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;
}
La imagen que se devuelve es de la imagen volteada. He intentado ajustar faceFeature.bounds
usar algo como esto:
CGAffineTransform t = CGAffineTransformMakeScale(1.0f,-1.0f);
CGRect newRect = CGRectApplyAffineTransform(faceFeature.bounds,t);
... pero eso me da resultados fuera de la imagen.
Estoy seguro de que hay algo sencillo para solucionar esto, pero si no se calcula el bottom-down y luego se crea un nuevo rect usando eso como X, ¿hay una forma "adecuada" de hacerlo?
Gracias!
Estoy investigando lo mismo, ¿podría explicar el cálculo que realizó para el eje y, por favor? ¿Y qué es la "cara más grande"? –