Sto provando a scrivere una routine che richiede una UIImage e restituisce una nuova UIImage che contiene solo la faccia. Questo sembra essere molto semplice, ma il mio cervello sta avendo problemi ad aggirare gli spazi CoreImage vs. UIImage.UIImage face detection
Ecco i principi fondamentali:
- (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;
}
L'immagine che viene restituito è da l'immagine ribaltata. Ho provato a regolare faceFeature.bounds
usando qualcosa di simile:
CGAffineTransform t = CGAffineTransformMakeScale(1.0f,-1.0f);
CGRect newRect = CGRectApplyAffineTransform(faceFeature.bounds,t);
... ma che dà i risultati all'esterno dell'immagine.
Sono sicuro che c'è qualcosa di semplice da risolvere, ma non calcolando il bottom-down e quindi creando un nuovo rect usando quello come X, c'è un modo "corretto" per farlo?
Grazie!
Sto osservando la stessa cosa, potresti spiegare il calcolo eseguito per l'asse y per favore ?. E che cos'è il "più grande"? –