2013-02-24 2 views
1

Мне нужно обрезать лицо/несколько лиц из заданного изображения и использовать обрезанное изображение лица для другого использования. Я использую CIDetectorTypeFace от CoreImage. Проблема в том, что новый UIImage, содержащий только обнаруженное лицо, должен быть больше по размеру, поскольку волосы отсечены или нижняя челюсть отключена. Как увеличить размер initWithFrame:faceFeature.bounds? Пример код я использую:Обрезка лица с помощью CoreImage

CIImage* image = [CIImage imageWithCGImage:staticBG.image.CGImage]; 
    CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace 
              context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]]; 
    NSArray* features = [detector featuresInImage:image]; 

    for(CIFaceFeature* faceFeature in features) 
    { 
     UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds]; 
     faceView.layer.borderWidth = 1; 
     faceView.layer.borderColor = [[UIColor redColor] CGColor]; 
     [staticBG addSubview:faceView]; 

     // cropping the face 
     CGImageRef imageRef = CGImageCreateWithImageInRect([staticBG.image CGImage], faceFeature.bounds); 
     [resultView setImage:[UIImage imageWithCGImage:imageRef]]; 
     CGImageRelease(imageRef); 
    } 

Примечания: красная рамка, что я сделал, чтобы показать обнаруженную область лица делает, не совсем совпадает с обрезанными изображениями. Может быть, я не показываю рамку правильно, но так как мне не нужно показывать фрейм, мне действительно нужно обрезанное лицо, я не беспокоюсь об этом.

ответ

4

Не уверен, но вы можете попробовать

CGRect biggerRectangle = CGRectInset(faceFeature.bounds, someNegativeCGFloatToIncreaseSizeForXAxis, someNegativeCGFloatToIncreaseSizeForYAxis); 
CGImageRef imageRef = CGImageCreateWithImageInRect([staticBG.image CGImage], biggerRectangle); 

https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGGeometry/Reference/reference.html#//apple_ref/c/func/CGRectInset

+0

Спасибо большое ... Это сработало! Я также использовал CGRectOffset, чтобы сделать его более точным. :) – Soumyajit

+0

Добро пожаловать! Если ответ решит вашу проблему, пожалуйста, подумайте о его маркировке как принятой (галочка с левой стороны). – blub