前言
CoreImage是Cocoa Touch中一个强大的API,也是iOS SDK中的关键部分,不过它经常被忽视。在本篇教程中,我会带大家一起验证CoreImage的人脸识别特性。在开始之前,我们先要简单了解下CoreImage framework 组成
CoreImage framework组成
Apple 已经帮我们把image的处理分类好,来看看它的结构:

主要分为三个部分:
1、定义部分:CoreImage 和CoreImageDefines。见名思义,代表了CoreImage 这个框架和它的定义。
2、操作部分:
滤镜(CIFliter):CIFilter 产生一个CIImage。典型的,接受一到多的图片作为输入,经过一些过滤操作,产生指定输出的图片。 检测(CIDetector):CIDetector 检测处理图片的特性,如使用来检测图片中人脸的眼睛、嘴巴、等等。 特征(CIFeature):CIFeature 代表由 detector处理后产生的特征。3、图像部分:
画布(CIContext):画布类可被用与处理Quartz 2D 或者 OpenGL。可以用它来关联CoreImage类。如滤镜、颜色等渲染处理。 颜色(CIColor): 图片的关联与画布、图片像素颜色的处理。 向量(CIVector): 图片的坐标向量等几何方法处理。 图片(CIImage): 代表一个图像,可代表关联后输出的图像。在了解上述基本知识后,我们开始通过创建一个工程来带大家一步步验证Core Image的人脸识别特性。
将要构建的应用
iOS的人脸识别从iOS 5(2011)就有了,不过一直没怎么被关注过。人脸识别API允许开发者不仅可以检测人脸,也可以检测到面部的一些特殊属性,比如说微笑或眨眼。
首先,为了了解Core Image的人脸识别技术我们会创建一个app来识别照片中的人脸并用一个方框来标记它。在第二个demo中,让用户拍摄一张照片,检测其中的人脸并检索人脸位置。这样一来,就充分掌握了iOS中的人脸识别,并且学会如何利用这个强大却总被忽略的API。
话不多说,开搞!
建立工程(我用的是Xcode8.0)
这里提供了初始工程,当然你也可以自己创建(主要是为了方便大家)点我下载 用Xcode打开下载后的工程,可以看到里面只有一个关联了IBOutlet和imageView的StoryBoard。

使用CoreImage识别人脸
在开始工程中,故事板中的imageView组件与代码中的IBOutlet已关联,接下来要编写实现人脸识别的代码部分。在ViewController.swift文件中写下如下代码:
import UIKit
import CoreImage // 引入CoreImage
class ViewController: UIViewController {
@IBOutlet weak var personPic: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
personPic.image = UIImage(named: "face-1")
// 调用detect
detect()
}
//MARK: - 识别面部
func detect() {
// 创建personciImage变量保存从故事板中的UIImageView提取图像并将其转换为CIImage,使用Core Image时需要用CIImage
guard let personciImage = CIImage(image: personPic.image!) else {
return
}
// 创建accuracy变量并设为CIDetectorAccuracyHigh,可以在CIDetectorAccuracyHigh(较强的处理能力)与CIDetectorAccuracyLow(较弱的处理能力)中选择,因为想让准确度高一些在这里选择CIDetectorAccuracyHigh
let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
// 这里定义了一个属于CIDetector类的faceDetector变量,并输入之前创建的accuracy变量
let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy)
// 调用faceDetector的featuresInImage方法,识别器会找到所给图像中的人脸,最后返回一个人脸数组
let faces = faceDetector?.features(in: personciImage)
// 循环faces数组里的所有face,并将识别到的人脸强转为CIFaceFeature类型
for face in faces as! [CIFaceFeature] {
print("Found bounds are (face.bounds)")
// 创建名为faceBox的UIView,frame设为返回的faces.first的frame,绘制一个矩形框来标识识别到的人脸
let faceBox = UIView(frame: face.bounds)
// 设置faceBox的边框宽度为3
faceBox.layer.borderWidth = 3
// 设置边框颜色为红色
faceBox.layer.borderColor = UIColor.red.cgColor
// 将背景色设为clear,意味着这个视图没有可见的背景
faceBox.backgroundColor = UIColor.clear
// 最后,把这个视图添加到personPic imageView上
personPic.addSubview(faceBox)
// API不仅可以帮助你识别人脸,也可识别脸上的左右眼,我们不在图像中标识出眼睛,只是给你展示一下CIFaceFeature的相关属性
if face.hasLeftEyePosition {
print("Left eye bounds are (face.leftEyePosition)")
}
if face.hasRightEyePosition {
print("Right eye bounds are (face.rightEyePosition)")
}
}
}
}










