iOS黑科技之(CoreImage)静态人脸识别(一)
人脸识别原理简介:每一张图片都是由每一个像素点组成,而每一个像素点中又有对应的颜色值(如RGB),人的面部特征中,不同的五官,颜色值肯定存在差异,而人脸识别技术就是通过对照片中每一个像素的识别进行大量的算法处理,最终得出五官的轮廓
- 这里我们将使用
CoreImage
框架,进行静态的人脸识别(类似照片, 图像等) - 苹果原生的人脸识别并不是一个独立的框架,而是放在
CoreImage
框架中 - Apple 已经帮我们把image的分类处理好了
- CoreImage是iOS5新增的强大类库之一,它可以处理图片的各种效果,什么饱和度啊,旋转变形啊,色彩啊等等。
- 在使用CoreImage之前要导入CoreImage.framework框架
主要类介绍
CIImage
- Core Image中的图像类,类似于UIKit中的UIImage类。
CIContext: 上下文对象
- 所有图像处理都在CIContext对象中实现,通过Quartz 2D、OpenGL渲染CIImage对象; 如滤镜、颜色等渲染处理
CIColor:颜色
- 图片的关联与画布、图片像素颜色的处理。
CIVector:向量
- 图片的坐标向量等几何方法处理。
CIDetector
特征识别类- 该类集成了苹果有关特征识别的一些功能。
- 可检测图片中人脸的眼睛、嘴巴、等等
CIFilter
- 滤镜类,包含一个字典结构,对各种滤镜定义了属于自己的属性
- CIFilter 产生一个CIImage
- 接受一到多的图片作为输入,经过一些过滤操作,产生指定输出的图片
CIFeature: 代表由 detector处理后产生的特征
项目代码介绍
创建
这里要先介绍一下检测器的类别
1 | //人脸检测器 |
- 这里需要的是人脸识别的
CIDetectorTypeFace
1 | //1. 创建上下文对象 |
参数设置
- 这里设置了一个识别精度CIDetectorAccuracy,识别精度的值有:
1 | //识别精度低,但识别速度快、性能高 |
- 除了精度的设置,还有
CIDetectorMinFeatureSize
用于设置将要识别的特征的最小尺寸,也就是说小于这个尺寸的特征将不识别。- 对于人脸检测器,这个关键字的值是从0.0 ~ 1.0的
NSNumber
值,这个值表示:基于输入图像短边长度的百分比。有效值范围:0.01 <=CIDetectorMinFeatureSize
<= 0.5。为这个参数设定更高值仅用于提高性能。默认值是0.15。 - 对于矩形探测器,这个关键字的值是从0.0 ~ 1.0的
NSNumber
值,这个值表示:基于输入图像短边长度的百分比。有效值范围:0.2 <=CIDetectorMinFeatureSize
<= 1.0的默认值是0.2。 - 对于文本探测器,这个关键字的值是一个范围从0.0 ~ 1.0的
NSNumber
值,这个值表示:基于输入图像高度的百分比。有效值范围:0.0 <=CIDetectorMinFeatureSize
<= 1.0。默认值是10/(输入图像的高度)
- 对于人脸检测器,这个关键字的值是从0.0 ~ 1.0的
CIFaceFeature概述
CIFaceFeature
是保存脸部所有信息的类CIFaceFeature
是CIFeature
的子类CIFeature
类只保存基本信息, 所有的附加信息由子类(CIFaceFeature
)保存- 各属性简介:
1 | //检测到的脸部在图片中的frame |
Core Image
坐标系问题
- 如图:
UIView
坐标系- 图中上半部分坐标系
- Y轴自上而下依次增大
Core Image
坐标系- 图中下半部分显示坐标系
- X轴与
UIView
坐标系相同, Y轴坐标系最底部为0, 自下而上依次增大, 与UIView
坐标系相反 - 所以需要对以次坐标设置frame的控件, 做一次针对Y轴的翻转, 如下:
1 | resultView.transform = CGAffineTransform(scaleX: 1, y: -1) |
人脸检测(核心代码)
1 | /// 通过人脸识别提取有效的人脸图片 |
检测结果展示
- 检测到的人脸部位展示红色矩形框
- 眼镜和嘴巴部位显示红色矩形框
- 照片随机选取的, 不喜勿喷
注意事项:
- image的实际尺寸需要和imageView的尺寸完全一样,获取的脸部各个部位的尺寸才能完全吻合
- 这里我只做了简单的尺寸比例转换
- 代码如下:
1 | static func getScale(imageView: UIImageView, image: UIImage) -> CGFloat{ |
GitHub–Demo地址
- 注意:
- 这里只是列出了主要的核心代码,具体的代码逻辑请参考demo
- 文中相关介绍有的地方如果有不是很详细或者有更好建议的,欢迎联系小编