您的位置:首页 > 其它

识别出脸部以及给脸部打马赛克

2015-06-01 21:40 337 查看
识别出脸部以及给脸部打马赛克



原始图片 & 打马后的图片





说明

1. 通过CIDetector来识别出脸部获取相关数据

2. 将CoreImage坐标转换为UIKit坐标

3. 将脸部区域进行截图

4. 将截图进行打马处理(各位喜闻乐见^_^)

核心源码

https://github.com/YouXianMing/FaceDetection

//
//  UIImageView+FaceDetect.h
//  FaceDetectionExample
//
//  Created by YouXianMing on 15/5/29.
//  Copyright (c) 2015年 JID Marketing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIImageView (FaceDetect)

- (NSArray *)faceRects;

@end


//
//  UIImageView+FaceDetect.m
//  FaceDetectionExample
//
//  Created by YouXianMing on 15/5/29.
//  Copyright (c) 2015年 JID Marketing. All rights reserved.
//

#import "UIImageView+FaceDetect.h"

@implementation UIImageView (FaceDetect)

- (NSArray *)faceRects {

if (self.image == nil) {
return nil;
}

// 初始化数组
NSMutableArray *faceRectsArray = [NSMutableArray array];

// 获取CIImage
CIImage* image                 = [CIImage imageWithCGImage:self.image.CGImage];

// 创建脸部识别器
CIDetector* detector           = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil
options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh
forKey:CIDetectorAccuracy]];

// 获取侦测到的数据
NSArray* features              = [detector featuresInImage:image];

// CoreImage坐标转换为UIKit坐标
CGAffineTransform transform    = CGAffineTransformMakeScale(1, -1);
transform                      = CGAffineTransformTranslate(transform, 0, -self.bounds.size.height);

// 处理
for(CIFaceFeature* faceFeature in features)
{
// 转换坐标系统
const CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform);

// 添加rect
[faceRectsArray addObject:[NSValue valueWithCGRect:faceRect]];
}

return faceRectsArray;
}

@end


//
//  ViewController.m
//  CoreImageMask
//
//  Created by YouXianMing on 15/5/29.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "UIImageView+FaceDetect.h"
#import "CIFilter+Utility.h"
#import "UIImage+Crop.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

UIImage *image = [UIImage imageNamed:@"demo.png"];

// 加载ImageView
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.center       = self.view.center;
[self.view addSubview:imageView];

NSArray *faceRectArray = [imageView faceRects];
for (int i = 0; i < faceRectArray.count; i++) {

// 获取脸部的rect
NSValue *value  = faceRectArray[i];
CGRect faceRect = value.CGRectValue;

// 截取脸部的图片
UIImage *faceImage = [image cropAtRect:faceRect];

// 添加脸部的图片
UIImageView *faceImageView = [[UIImageView alloc] initWithImage:[self CIPixellateImage:faceImage]];
faceImageView.frame        = faceRect;
[imageView addSubview:faceImageView];
}
}

- (UIImage *)CIPixellateImage:(UIImage *)image {

CIImage *ciImage  = [[CIImage alloc] initWithImage:image];
CIFilter *filter  = [CIFilter filterWithName:@"CIPixellate"];
filter.inputImage = ciImage;
filter.inputScale = @(5.f);

return [filter outputUIImage];
}

@end


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: