本文将演示对图片中的人像,进行面部检测。
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
1 import UIKit 2 //导入要使用的CoreImage框架 3 //该框架提供了强大和高效的图片处理功能。 4 //用来对基于像素的图像进行分析、操作和特效处理 5 import CoreImage 6 7 class ViewController: UIViewController { 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view, typically from a nib. 12 13 //将当前视图控制器的背景颜色设置为黑色,以突出显示图像视图 14 self.view.backgroundColor = UIColor.black 15 16 //从项目资源文件夹中,读取一张图片资源。 17 let image = UIImage(named: "Picture") 18 //创建一个图像视图,并知指定需要显示的图片 19 let imageView = UIImageView(image: image) 20 //设置图像视图的中心点坐标,位于(160,260) 21 imageView.center = CGPoint(x: 160, y: 260) 22 //将图像视图,添加到当前视图控制器的根视图。 23 self.view.addSubview(imageView) 24 25 //初始化一个CoreImage图像对象,并加载之前导入的图片 26 let ciImage = CIImage(image: image!) 27 //创建一个上下文对象,该对象是对图像进行处理的具体对象 28 let ciContext: CIContext = { return CIContext(options: nil) }() 29 //创建一个检测对象,并设置检测类型为面部检测,检测精准度为高精度。 30 //该对象使用图像处理机制,去搜索并识别在图片或影片中, 31 //明显存在的面部、矩形、条形码等对象。 32 let ciDetector = CIDetector(ofType: CIDetectorTypeFace, context: ciContext, 33 options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]) 34 35 //获得图像的尺寸信息 36 let ciImageSize = ciImage!.extent.size 37 //CoreImage框架坐标系统的原点,位于屏幕左下角。 38 //UIView坐标系统的原点,位于屏幕左上角。 39 //所以需要对识别到的面部区域,进行上下反转操作 40 var transform = CGAffineTransform.identity 41 //设置在垂直方向上,进行翻转操作。 42 transform = transform.scaledBy(x: 1.0, y: -1.0) 43 //然后设置在垂直方向上移动的距离。 44 transform = transform.translatedBy(x: 0, y: ciImageSize.height * -1) 45 46 //创建一个数组,用来存储检测到的所有面部信息。 47 let features: [CIFeature]! = ciDetector!.features(in: ciImage!) 48 //添加一个循环语句,对数组进行操作 49 for feature in features 50 { 51 //对检测到的面部区域,进行反转操作。 52 //使面部区域能够显示在图像视图的正确位置。 53 let frame = feature.bounds.applying(transform) 54 //初始化一个图像对象,并设置其位置和尺寸与面部区域相同 55 let faceView = UIView(frame: frame) 56 //设置视图层的边框宽度为2 57 faceView.layer.borderWidth = 2 58 //设置视图层的边框颜色为白色 59 faceView.layer.borderColor = UIColor.white.cgColor 60 61 //将视图添加到当前视图控制器的根视图 62 imageView.addSubview(faceView) 63 } 64 } 65 66 override func didReceiveMemoryWarning() { 67 super.didReceiveMemoryWarning() 68 // Dispose of any resources that can be recreated. 69 } 70 }