2014-04-16 3 views
2

나는 CoreImage을 사용하여 얼굴을 탐지합니다. 얼굴 감지 후 얼굴을 자르고 싶습니다. 이 스 니펫을 사용하여 얼굴을 감지합니다.검출 된 얼굴을 잘라내는 방법

-(void)markFaces:(UIImageView *)facePicture{ 


CIImage* image = [CIImage imageWithCGImage:imageView.image.CGImage]; 

CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace 
              context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]]; 


NSArray* features = [detector featuresInImage:image]; 


CGAffineTransform transform = CGAffineTransformMakeScale(1, -1); 
transform = CGAffineTransformTranslate(transform, 0, -imageView.bounds.size.height); 


for(CIFaceFeature* faceFeature in features) 
{ 
    // Get the face rect: Translate CoreImage coordinates to UIKit coordinates 
    const CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform); 


    faceView = [[UIView alloc] initWithFrame:faceRect]; 
    faceView.layer.borderWidth = 1; 
    faceView.layer.borderColor = [[UIColor redColor] CGColor]; 


    UIGraphicsBeginImageContext(faceView.bounds.size); 
    [faceView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    //Blur the UIImage with a CIFilter 
    CIImage *imageToBlur = [CIImage imageWithCGImage:viewImage.CGImage]; 
    CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"]; 
    [gaussianBlurFilter setValue:imageToBlur forKey: @"inputImage"]; 
    [gaussianBlurFilter setValue:[NSNumber numberWithFloat: 10] forKey: @"inputRadius"]; 
    CIImage *resultImage = [gaussianBlurFilter valueForKey: @"outputImage"]; 
    UIImage *endImage = [[UIImage alloc] initWithCIImage:resultImage]; 

    //Place the UIImage in a UIImageView 
    UIImageView *newView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
    newView.image = endImage; 
    [self.view addSubview:newView]; 

    CGFloat faceWidth = faceFeature.bounds.size.width; 

    [imageView addSubview:faceView]; 

    // LEFT EYE 
    if(faceFeature.hasLeftEyePosition) 
    { 

     const CGPoint leftEyePos = CGPointApplyAffineTransform(faceFeature.leftEyePosition, transform); 

     UIView *leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(leftEyePos.x - faceWidth*EYE_SIZE_RATE*0.5f, 
                     leftEyePos.y - faceWidth*EYE_SIZE_RATE*0.5f 
                     ,faceWidth*EYE_SIZE_RATE, 
                     faceWidth*EYE_SIZE_RATE)]; 

     NSLog(@"Left Eye X = %0.1f Y = %0.1f Width = %0.1f Height = %0.1f",leftEyePos.x - faceWidth*EYE_SIZE_RATE*0.5f, 
       leftEyePos.y - faceWidth*EYE_SIZE_RATE*0.5f,faceWidth*EYE_SIZE_RATE, 
       faceWidth*EYE_SIZE_RATE); 

     leftEyeView.backgroundColor = [[UIColor magentaColor] colorWithAlphaComponent:0.3]; 
     leftEyeView.layer.cornerRadius = faceWidth*EYE_SIZE_RATE*0.5; 


     [imageView addSubview:leftEyeView]; 
    } 


    // RIGHT EYE 
    if(faceFeature.hasRightEyePosition) 
    { 

     const CGPoint rightEyePos = CGPointApplyAffineTransform(faceFeature.rightEyePosition, transform); 


     UIView *rightEye = [[UIView alloc] initWithFrame:CGRectMake(rightEyePos.x - faceWidth*EYE_SIZE_RATE*0.5, 
                    rightEyePos.y - faceWidth*EYE_SIZE_RATE*0.5, 
                    faceWidth*EYE_SIZE_RATE, 
                    faceWidth*EYE_SIZE_RATE)]; 



     NSLog(@"Right Eye X = %0.1f Y = %0.1f Width = %0.1f Height = %0.1f",rightEyePos.x - faceWidth*EYE_SIZE_RATE*0.5f, 
       rightEyePos.y - faceWidth*EYE_SIZE_RATE*0.5f,faceWidth*EYE_SIZE_RATE, 
       faceWidth*EYE_SIZE_RATE); 

     rightEye.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.2]; 
     rightEye.layer.cornerRadius = faceWidth*EYE_SIZE_RATE*0.5; 
     [imageView addSubview:rightEye]; 
    } 


    // MOUTH 
    if(faceFeature.hasMouthPosition) 
    { 

     const CGPoint mouthPos = CGPointApplyAffineTransform(faceFeature.mouthPosition, transform); 


     UIView* mouth = [[UIView alloc] initWithFrame:CGRectMake(mouthPos.x - faceWidth*MOUTH_SIZE_RATE*0.5, 
                   mouthPos.y - faceWidth*MOUTH_SIZE_RATE*0.5, 
                   faceWidth*MOUTH_SIZE_RATE, 
                   faceWidth*MOUTH_SIZE_RATE)]; 

     NSLog(@"Mouth X = %0.1f Y = %0.1f Width = %0.1f Height = %0.1f",mouthPos.x - faceWidth*MOUTH_SIZE_RATE*0.5f, 
       mouthPos.y - faceWidth*MOUTH_SIZE_RATE*0.5f,faceWidth*MOUTH_SIZE_RATE, 
       faceWidth*MOUTH_SIZE_RATE); 


     mouth.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.3]; 
     mouth.layer.cornerRadius = faceWidth*MOUTH_SIZE_RATE*0.5; 
     [imageView addSubview:mouth]; 

    } 
} 
} 

내가 원하는 것은 얼굴을 자르는 것입니다.

+0

얼굴 감지 기능을 사용하여 원하지 않는 무언가를 수행하는 코드를 게시했습니다. 이 코드에는 이미지 좌표의 이미지에서 각면의 사각형 계산이 포함됩니다. 다음 작업은 해당 코드를 추출하여 해당 사각형에서 다른 이미지로 변환하는 것입니다. 원하는 출력 이미지의 크기 인 컨텍스트를 작성한 다음 drawInRect를 사용하여 얼굴이있는 부분을 해당 이미지 컨텍스트로 렌더링 할 수 있어야합니다. 시도해보십시오. 문제가 있으면 코드를 게시하고 도움을 요청하십시오. –

답변

0

이 기능을 사용하여 얼굴을 쉽게자를 수 있습니다. 테스트를 거쳐 제대로 작동합니다.

-(void)faceWithFrame:(CGRect)frame{ 
    CGRect rect = frame; 
    CGImageRef imageRef = CGImageCreateWithImageInRect([self.imageView.image CGImage], rect); 
    UIImage *cropedImage = [UIImage imageWithCGImage:imageRef]; 
    self.cropedImg.image =cropedImage; 
} 

얼굴 프레임을 통과하면 위의 기능이 자르기 얼굴 이미지를 제공합니다.