iOS利用CoreImage实现人脸识别详解

2020-01-20 13:13:48刘景俊

前言

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

CoreImage framework组成

Apple 已经帮我们把image的处理分类好,来看看它的结构:

coreimage,人脸识别,ios,demo

主要分为三个部分:

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,人脸识别,ios,demo

使用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)")
  }
 }
 }
}