iOS8 Core Image In Swift:人脸检测以及马赛克

iOS8 Core Image In Swift:自动改善图像以及内置滤镜的使用

iOS8 Core Image In Swift:更复杂的滤镜

iOS8 Core Image In Swift:人脸检测以及马赛克

iOS8 Core Image In Swift:视频实时滤镜


Core Image不仅内置了诸多滤镜,还能检测图像中的人脸,不过Core Image只是检测,并非识别,检测人脸是指在图像中寻找符合人脸特征(只要是个人脸)的区域,识别是指在图像中寻找指定的人脸(比如某某某的脸)。Core Image在找到符合人脸特征的区域后,会返回该特征的信息,比如人脸的范围、眼睛和嘴巴的位置等。



人脸检测并标记检测到的区域

先做好以下几步:
  1. 新建一个Single View Application工程
  2. 然后在Storyboard里放入UIImageView,ContentMode设置为Aspect Fit
  3. 将UIImageView连接到VC里
  4. 放入一个名为“人脸检测”的UIButton,然后连接到VC的faceDetecting方法上
  5. 关闭Auto Layout以及Size Classes
UIImageView的frame以及VC的UI如下:


以下是工程中会用到的图,齐刷刷一排脸,点击图片显示原图:



然后在VC上添加基本的属性:懒加载的originalImage、context(Core Image框架绕不开的对象)。

class ViewController: UIViewController {

    @IBOutlet var imageView: UIImageView!

    lazy var originalImage: UIImage = {

        return UIImage(named: "Image")

    }()

    lazy var context: CIContext = {

        return CIContext(options: nil)

    }()

...... 

在viewDidLoad方法里显示originalImage:

override func viewDidLoad() {

    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.

    self.imageView.image = originalImage

} 

然后就可以准备实现faceDetecting方法了。
在Core Image框架中, CIDetector对象提供了对图像检测的功能,只需要通过几个APIs就能完成CIDetector的初始化并得到检测结果:


@IBAction func faceDetecing() {

    let inputImage = CIImage(image: originalImage)

    let detector = CIDetector(ofType: CIDetectorTypeFace,

                             context: context,

                             options: [CIDetectorAccuracyCIDetectorAccuracyHigh])

    var faceFeatures: [CIFaceFeature]!

    if let orientation: AnyObject = inputImage.properties()?[kCGImagePropertyOrientation] {

        faceFeatures = detector.featuresInImage(inputImage, 

                                                options: [CIDetectorImageOrientation: orientation]

                                               ) as [CIFaceFeature]

    } else {

        faceFeatures = detector.featuresInImage(inputImage) as [CIFaceFeature]

    }


    println(faceFeatures)

......

使用kCGImagePropertyOrientation的时候,可能需要导入ImageIO框架
originalImage和context通过懒加载都得到了,在创建CIDetector对象的时候,必须告诉它要检测的内容,这里当然是传 CIDetectorTypeFace了,除了CIDetectorTypeFace外,CIDetector还能检测二维码;然后传递一个context,多个CIDetector可以共用一个context对象;第三个参数是一个字典,我们能够指定检测的精度,除了CIDetectorAccuracyHigh以外,还有CIDetectorAccuracyLow,精度高会识别度更高,但识别速度就更慢。
创建完CIDetector之后,把要识别的CIImage传递给它,在这里,我判断了CIImage是否带有方向的元数据,如果带的话调用就 featuresInImage:options这个方法,因为方向对CIDetector来说至关重要,直接导致识别的成功与否;而有的图片没有方向这些元数据,就调用 featuresInImage方法,由于这张《生活大爆炸》的图是不带方向元数据的,所以是执行的featuresInImage方法,但是大多数情况下应该会用到前者。
featuresInImage方法的返回值是一个 CIFaceFeature数组,CIFaceFeature包含了面部的范围、左右眼、嘴巴的位置等,我们通过使用bounds就能标记出面部的范围。
我们很容易写出这样的代码:
  1. 获取所有的面部特征
  2. 用bounds实例化一个UIView
  3. 把View显示出来
实现出来就像这样:
  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值