识别出脸部以及给脸部打马赛克
原始图片 & 打马后的图片
说明
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