您的位置:首页 > 移动开发 > IOS开发

iOS:面部识别技术的实现

2020-04-20 12:40 447 查看

概述:

  CoreImage是一个图像框架,它基于OpenGL顶层创建,底层则用着色器来处理图像,这意味着它利用了GPU基于硬件加速来处理图像。CoreImage中有很多滤镜,它们能够一次给予一张图像或者视频帧多种视觉效果。而且滤镜可以连接起来组成一个滤镜链,把滤镜效果叠加起来处理图像。

  CoreImage框架最早出现于iOS5,iOS6也对这个框架进行了扩展,这篇博客的Demo是基于iOS7的。

 

CoreImage框架最常用的类: 

* CIImage

  保存图像数据的类,可以通过UIImage,图像文件或者像素数据来创建,包括未处理的像素数据如:

- imageWithCVPixelBuffer:

- imageWithData:

方法等等。

  也可以通过图像数据类比如UIImage,CGImageRef等等。

* CIFilter

  滤镜类,这个框架中对图片属性进行细节处理的类。它对所有的像素进行操作,用一些键-值设置来决定具体操作的程度。

* CIContext

  上下文类,如CoreGraphics以及CoreData中的上下文用于处理绘制渲染以及处理托管对象一样,CoreImage的上下文也是实现对图像处理的具体对象。

  这里需要注意的是在Context创建的时候,我们需要给它设定为是基于GPU还是CPU。(这里使用GPU)

  基于GPU的话,处理速度更快,因为利用了GPU硬件的并行优势。但是GPU受限于硬件纹理尺寸,而且如果你的程序在后台继续处理和保存图片的话,那么需要使用CPU,因为当app切换到后台状态时GPU处理会被打断。

 

简单使用:

  简介完三个类之后,介绍下简单使用步骤:

  实例化一个CIImage,

  创建一个你需要的CIFilter滤镜并给滤镜设置属性,

  创建CIContext上下文来初始化一个CGImageRef对象,

  再将其赋给UIImage对象进行显示。

  CoreImage类中提供了一个CIDectetor类来给我们提供两种类型的检测器。

  其中一种即是面部检测:

[code] 1 - (BOOL)hasFace:(UIImage *)image
2 {
3     NSArray *features = [self featuresWithImage:image];
4     return features.count ? YES : NO;
5 }
6
7 - (NSArray *)featuresWithImage:(UIImage *)image
8 {
9     CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace
10                                                   context:nil
11                                                   options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];
12     CIImage *ciimg = [CIImage imageWithCGImage:image.CGImage];
13     NSArray *features = [faceDetector featuresInImage:ciimg];
14     return features;
15 }

创建检测器时传入Type参数指定为面部即可,options中可以传入一个检测精度。

下面是返回图片中所有左眼位置、右眼位置以及嘴部位置的方法。

左眼:

[code] 1 - (NSArray *)leftEyePositionsWithImage:(UIImage *)image
2 {
3     if (![self hasFace:image]) return nil;
4
5     NSArray *features = [self featuresWithImage:image];
6     NSMutableArray *arrM = [NSMutableArray arrayWithCapacity:features.count];
7     for (CIFaceFeature *f in features) {
8         if (f.hasLeftEyePosition) [arrM addObject:[NSValue valueWithCGPoint:f.leftEyePosition]];
9     }
10     return arrM;
11 }

右眼:

[code] 1 - (NSArray *)rightEyePositionsWithImage:(UIImage *)image
2 {
3     if (![self hasFace:image]) return nil;
4
5     NSArray *features = [self featuresWithImage:image];
6     NSMutableArray *arrM = [NSMutableArray arrayWithCapacity:features.count];
7     for (CIFaceFeature *f in features) {
8         if (f.hasRightEyePosition) [arrM addObject:[NSValue valueWithCGPoint:f.rightEyePosition]];
9     }
10     return arrM;
11 }

嘴部:

[code] 1 - (NSArray *)mouthPositionsWithImage:(UIImage *)image
2 {
3     if (![self hasFace:image]) return nil;
4
5     NSArray *features = [self featuresWithImage:image];
6     NSMutableArray *arrM = [NSMutableArray arrayWithCapacity:features.count];
7     for (CIFaceFeature *f in features) {
8         if (f.hasMouthPosition) [arrM addObject:[NSValue valueWithCGPoint:f.mouthPosition]];
9     }
10     return arrM;
11 }
  • 点赞
  • 收藏
  • 分享
  • 文章举报
GS-NICE 发布了177 篇原创文章 · 获赞 0 · 访问量 2741 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: