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

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

OS的人脸识别从iOS 5(2011)就有了,但一直没怎么重视。人脸识别API让开发者不仅可以检测人脸,还可以检测人脸的一些特殊属性,比如微笑或者眨眼。下面这篇文章主要介绍iOS使用CoreImage实现人脸识别的相关信息。有需要的朋友可以参考一下。

前言

CoreImage是Cocoa Touch中一个强大的API,也是iOS SDK的关键部分,但却经常被忽视。在本教程中,我将带您验证CoreImage的人脸识别功能。在开始之前,我们先简单了解一下CoreImage框架的组成。

CoreImage framework组成

苹果为我们梳理了图像的处理。让我们来看看它的结构:

主要分为三个部分:

1.定义:CoreImage和CoreImageDefines。顾名思义,它代表了CoreImage及其定义的框架。

2.操作部分:

ci filter):ci filter生成CIImage。通常,接受一个或多个图片作为输入,在一些过滤操作之后,生成指定的输出图片。

CIDetector):CIDetector检测被处理图片的特征,如眼睛、嘴巴等。用于检测图片中的人脸。

CIFeature):CIFeature表示检测器处理后产生的特征。

3.图像部分:

ci context:canvas类可用于处理石英2D或OpenGL。您可以使用它来关联CoreImage类。如滤镜、颜色等。

色彩(CIColor):画面的联想以及画布和画面像素色彩的处理。

CIVector:图片的坐标向量是用几何方法处理的。

CIImage:表示一个图像,可以表示关联后的图像输出。

了解以上基础知识后,我们开始创建项目,带你一步步验证Core Image的人脸识别特征。

将要构建的应用

面向iOS的人脸识别从iOS 5(2011)开始就有了,但一直没怎么被重视。人脸识别API让开发者不仅可以检测人脸,还可以检测人脸的一些特殊属性,比如微笑或者眨眼。

首先,为了了解Core Image的人脸识别技术,我们会创建一个app来识别照片中的人脸,并用方框标记出来。在第二个演示中,用户被要求拍摄一张照片,检测照片中的人脸,并检索人脸的位置。这样你就可以全面掌握iOS中的人脸识别,学会如何利用这个强大却总是被忽视的API。

话不多说,动手吧!

建立工程(我用的是Xcode8.0)

这里提供了初始项目。当然也可以自己创建(主要是为了方便大家)。点我下载,用Xcode打开下载的项目。您可以看到只有一个故事板与IBOutlet和imageView相关联。

使用CoreImage识别人脸

在项目开始时,故事板中的imageView组件已经与代码中的IBOutlet相关联。接下来会写实现人脸识别的代码部分。在ViewController.swift文件中编写以下代码:

导入UIKit

导入CoreImage //导入CoreImage

类view controller:uiview controller {

@IBOutlet弱var personPic: UIImageView!

覆盖func viewDidLoad() {

super.viewDidLoad()

personPic.image=UIImage(名为:' face-1 ')

//呼叫检测

检测()

}

//MARK:-识别人脸

函数检测(){

//创建personciImage变量,将从UIImageView中提取的图像保存在storyboard中,并转换为ciImage。使用核心映像时需要CIImage。

guard let person ci image=ci image(image:person pic . image!)否则{

返回

}

//创建一个精度变量,并将其设置为Cietector Accuraciyhigh。您可以在Cietector Accuraciyhigh(强处理能力)和CIDetectorAccuracyLow(弱处理能力)之间进行选择,因为您需要更高的精度。在此选择Cietector Accuraciyhigh。

let accuracy=[CIDetectorAccuracy:CIDetectorAccuracyHigh]

//这里定义了一个属于CIDetector类的faceDetector变量,输入之前创建的精度变量。

let face detector=CIDetector(of type:CIDetector typeface,context: nil,options: accuracy)

//调用面部检测器的特征图像方法,识别器会找到所给图像中的人脸,最后返回一个人脸数组

let faces=faceDetector?特征(在:personciImage中)

//循环表面数组里的所有脸,并将识别到的人脸强转为CIFaceFeature类型

因为面对着面对着![cifaceffeature]{

打印('找到的界限是\(face.bounds)')

//创建名为faceBox的UIView,框架设为返回的面部优先的框架,绘制一个矩形框来标识识别到的人脸

让face box=ui view(frame:face。界限)

//设置faceBox的边框宽度为3

faceBox.layer.borderWidth=3

//设置边框颜色为红色

面盒。层。边框颜色=用户界面颜色。红色。CG颜色

//将背景色设为清楚了,意味着这个视图没有可见的背景

面盒。背景色=用户界面颜色。清楚的

//最后,把这个视图添加到个人图像视图上

personPic.addSubview(faceBox)

//API不仅可以帮助你识别人脸,也可识别脸上的左右眼,我们不在图像中标识出眼睛,只是给你展示一下CIFaceFeature的相关属性

if face.hasLeftEyePosition {

打印('左眼边界是\(face.leftEyePosition)')

}

如果face.hasRightEyePosition {

打印('右眼界限是\(脸。righteyesposition)')

}

}

}

}

编译并运行app,结果应如下图所示:

根据控制台的输出来看,貌似识别器识别到了人脸:

找到的界限是(314.0,243.0,196.0,196.0)

当前的实现中没有解决的问题:

人脸识别是在原始图像上进行的,由于原始图像的分辨率比图像视图要高,因此需要设置图像视图的内容模式为特征匹配(保持纵横比的情况下缩放图片)。为了合适的绘制矩形框,需要计算图像视图中人脸的实际位置与尺寸

还要注意的是,CoreImage与UIView使用两种不同的坐标系统(看下图),因此要实现一个核心图像坐标到UIView坐标的转换。

UIView坐标系:

核心图像坐标系:

现在使用下面的代码替换检测()方法:

功能检测1() {

警卫让人ci形象=ci形象(形象:人pic。形象!)else { return }

let accuracy=[CIDetectorAccuracy:CIDetectorAccuracyHigh]

假设人脸检测器=CIDetector(类型:CIDetector字样,上下文:无,选项:准确性)

let faces=faceDetector?特征(在:personciImage中)

//转换坐标系

设ci形象大小=人物ci形象。程度。大小

var transform=CGAffineTransform(scaleX:1,y: -1)

变换=变换。平移者(x:0,y: -ciImageSize.height)

因为面对着面对着![cifaceffeature]{

打印('找到的界限是\(face.bounds)')

//应用变换转换坐标

var faceViewBounds=face。界限。应用(转换)

//在图像视图中计算矩形的实际位置和大小

让viewSize=person pic。界限。大小

设scale=min(视图大小。宽度/ci图像大小。宽度,视图大小。高度/ci图像大小。高度)

let offsetX=(viewsize。宽度-ci图像大小。宽度*比例)/2

let offsetY=(viewsize。高度-ci图像大小。高度*比例)/2

faceViewBounds=faceViewBounds。正在应用(CGAffineTransform(scaleX:scale,y: scale))

faceviewbounds。起源。x=offsetX

faceviewbounds。起源。y=小康

让face box=ui视图(frame:faceViewBounds)

faceBox.layer.borderWidth=3

面盒。层。边框颜色=用户界面颜色。红色。CG颜色

面盒。背景色=用户界面颜色。清楚的

personPic.addSubview(faceBox)

if face.hasLeftEyePosition {

打印('左眼边界是\(face.leftEyePosition)')

}

如果face.hasRightEyePosition {

打印('右眼界限是\(脸。righteyesposition)')

}

}

}

上述代码中,首先使用仿射变换(仿射变换)将核心图像坐标转换为UIKit坐标,然后编写了计算实际位置与矩形视图尺寸的代码。

再次运行app,应该会看到人的面部周围会有一个框好的,你已经成功使用核心图像识别出了人脸。

但是有的童鞋在使用了上面的代码运行后可能会出现方框不存在(即没有识别人脸)这种情况,这是由于忘记关闭自动布局以及尺寸等级了。选中情节串连图板中的视图控制器,选中视角下的图像视图。然后在右边的面板中的第一个选项卡中找到使用自动布局,将前面的去掉就可以了

经过上面的设置后我们再次运行App,就会看到图三出现的效果了。

构建一个人脸识别的相机应用

想象一下你有一个用来照相的相机app,照完相后你想运行一下人脸识别来检测一下是否存在人脸。若存在一些人脸,你也许想用一些标签来对这些照片进行分类。我们不会构建一个保存照片后再处理的app,而是一个实时的相机app,因此需要整合一下UIImagePicker类,在照完相时立刻进行人脸识别。

在开始工程中已经创建好了CameraViewController类,使用如下代码实现相机的功能:

类摄像机视图控制器:uiview控制器,UIImagePickerControllerDelegate,UINavigationControllerDelegate {

@ IBOutlet var imageView:ui imageView!

let image picker=UIImagePickerController()

覆盖func viewDidLoad() {

super.viewDidLoad()

imagePicker.delegate=self

}

@ I action func拍照(_发件人:任何对象){

如果!uiimagepickercontroller。issourcetypeavailable(.相机){

返回

}

图像拾取器。允许编辑=假

imagePicker.sourceType=.照相机

存在(图像拾取器,动画:真,完成:无)

}

func图像拾取器控制器(_ picker:UIImagePickerController,difinishpickingmediwithinfo info:[String:Any]){

如果让picked image=info[UIImagePickerControllerOriginalImage]as?UIImage {

imageView.contentMode=.scaleAspectFit

imageView.image=pickedImage

}

解散(动画:真,完成:零)

自我检测()

}

UIImagePickerController取消(_ picker:UIImagePickerController){

解散(动画:真,完成:零)

}

}

前面几行设置UIImagePicker委托为当前视图类,在didFinishPickingMediaWithInfo方法(UIImagePicker的委托方法)中设置图像视图为在方法中所选择的图像,接着返回上一视图调用发现函数。

还没有实现发现函数,插入下面代码并分析一下:

函数检测(){

设图像选项=ns字典(对象:NSNumber(值:5)为ns数,forKey:cidetectorimageoorientation为NSString)

让人ci形象=ci形象(CG形象:imageview。形象!cgImage!)

let accuracy=[CIDetectorAccuracy:CIDetectorAccuracyHigh]

假设人脸检测器=CIDetector(类型:CIDetector字样,上下文:无,选项:准确性)

let faces=faceDetector?功能(在:personciImage,options: imageOptions as?[字符串:任意对象])

如果让脸=脸?首先作为?CIFaceFeature {

打印('找到的界限是\(face.bounds)')

let alert=UIAlertController(title:'提示,消息: '检测到了人脸,首选样式:uialertcontrollerstyle。警报)

警惕。addaction(UIAlertAction(标题:'确定,样式:uialertactionstyle。默认值,处理程序:nil))

自我呈现(警报,动画:真,完成:无)

if face.hasSmile {

打印('脸在笑');

}

if face.hasLeftEyePosition {

打印('左眼的位置:\(face.leftEyePosition)')

}

如果face.hasRightEyePosition {

打印('右眼的位置:\(脸。rightyeposition)')

}

}否则{

let alert=UIAlertController(title:'提示,消息: '未检测到人脸,首选样式:uialertcontrollerstyle。警报)

警惕。addaction(UIAlertAction(标题:'确定,样式:uialertactionstyle。默认值,处理程序:nil))

自我呈现(警报,动画:真,完成:无)

}

}

这个检测()函数与之前实现的发现函数非常像,不过这次只用它来获取图像不做变换。当识别到人脸后显示一个警告信息"检测到了人脸!",否则显示"未检测到人脸"。运行应用测试一下:

我们已经使用了CIFaceFeature的一些属性和方法。比如你想检测一个人是否微笑,可以打电话。hasSmile,它将返回一个布尔值。你可以用。hasLeftEyePosition和。分别检测左眼和右眼的存在。

同样,可以调用hasMouthPosition来检测是否有嘴,如果有,可以按如下方式使用MouthPosition属性:

if (face.hasMouthPosition) {

打印(“检测到嘴”)

}

如你所见,使用核心图像检测面部特征非常简单。除了检测嘴巴、微笑和眼睛,还可以调用leftEyeClosed和rightEyeClosed来检测左右眼是否睁开,这里就不贴代码了。

总结

在本教程中,我们尝试了CoreImage的人脸识别API以及如何在相机app中应用它,并构建了一个简单的UIImagePicker来选择照片并检测图像中是否有人。

如你所见,Core Image的人脸识别是一个强大的API!希望这篇教程能给你一些关于这个鲜为人知的iOS API的有用信息。

Github地址:点击swift版本地址和OC版本地址下载。

本地下载:点击swift版本地址和OC版本地址下载。

好了,这就是本文的全部内容。希望这篇文章的内容能给你的学习或者工作带来一些帮助。有问题可以留言交流。谢谢你的支持。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • nagios监控使用方法,nagios下载
  • nagios监控使用方法,nagios下载,Nagios的安装与使用详细教程
  • ios长截图方法,iOS怎样长截图
  • ios长截图方法,iOS怎样长截图,iOS实现简单长截图
  • ios网络视频播放器,Ios音乐播放器
  • ios网络视频播放器,Ios音乐播放器,iOS利用AVPlayer播放网络音乐的方法教程
  • ios状态栏怎么自定义,ios状态栏图标
  • ios状态栏怎么自定义,ios状态栏图标,iOS中状态栏的基本使用方法汇总
  • ios旋转立体图形游戏,ios 旋转屏幕
  • ios旋转立体图形游戏,ios 旋转屏幕,iOS动画特效之立方体翻转
  • iOS推送延迟,ios消息延迟的解决方法
  • iOS推送延迟,ios消息延迟的解决方法,对比分析iOS延迟执行的4种方式
  • ios build版本号规范,ios version什么意思
  • ios build版本号规范,ios version什么意思,iOS 项目中的version和build 详解
  • 电脑bios没有u盘启动选项怎么办,win10u盘启动bios设置后还是无法启动
  • 留言与评论(共有 条评论)
       
    验证码: