博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
识别出脸部以及给脸部打马赛克
阅读量:6914 次
发布时间:2019-06-27

本文共 3296 字,大约阅读时间需要 10 分钟。

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

 

原始图片 & 打马后的图片

 

 

说明

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

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

3. 将脸部区域进行截图

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

 

核心源码

////  UIImageView+FaceDetect.h//  FaceDetectionExample////  Created by YouXianMing on 15/5/29.//  Copyright (c) 2015年 JID Marketing. All rights reserved.//#import 
@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

转载地址:http://yqncl.baihongyu.com/

你可能感兴趣的文章
git pull force
查看>>
scons用户手册
查看>>
使用new操作符来调用一个构造函数的时候发生了什么
查看>>
element-ui之el-scrollbar源码解析学习
查看>>
ceph 的pg诊断
查看>>
交换机配置vlan 访问控制列表
查看>>
我的友情链接
查看>>
12个时间管理妙招
查看>>
Python面向对象之类的成员
查看>>
Win8上iis配置
查看>>
Confluence 6 配置 Office 转换器
查看>>
IT从业人员关注哪些问题
查看>>
Windows 2012 Hyper –V 3.0 New Functions
查看>>
maven部分插件配置demo
查看>>
Grin交易原理详解
查看>>
大数据体系【概念认知】系列-2:存储以及副本策略
查看>>
我的友情链接
查看>>
linux企业常用服务---haproxy+nginx搭建web高可用集群
查看>>
win7 断开 共享连接的操作方法
查看>>
CTSSD服务无法正常启动:Failure 4 in trying to open SV key PROCL-4/PROCL-5 clsctss_r_av2
查看>>