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


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

    原始图片 & 打马后的图片

     

    说明

    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

  • 相关阅读:
    JSON.stringify深拷贝的缺点
    Vue生命周期和详细的执行过程
    CSS中width:100%和width:auto的区别
    react中的setState的使用和深入理解
    一文看懂Chrome浏览器运行机制
    闭包和垃圾回收机制
    linux 下的文件下载和上传
    mvn install本地安装jar到指定仓库
    内网maven依赖仓库jar报错解决
    hbase源码编译调试
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4543188.html
Copyright © 2020-2023  润新知