Swift之Vision 图像识别框架
- 2017年苹果大大又推出了新机型iPhone 8和iPhone 8Plus, 这还不是重点, 重点是那一款价值9000RMB的iPhone X, 虽说网上吐槽声从未停止过, 但是我觉得还是不错的哈!
- 软件方面, 苹果大大也推出了iOS 11, 经本人iPhone 7手机亲测, 耗电快外加通知栏改不完的bug
- 当然了随着iOS 11的推出, 也随之推出了一些新的API,如:
ARKit
、Core ML
、FileProvider
、IdentityLookup
、Core NFC
、Vison
等。 - 这里我们还要说的就是Apple 在 WWDC 2017 推出的图像识别框架–
Vison
官方文档 - Demo地址
一. Vision应用场景
Face Detection and Recognition
: 人脸检测
- 支持检测笑脸、侧脸、局部遮挡脸部、戴眼镜和帽子等场景,可以标记出人脸的矩形区域
- 可以标记出人脸和眼睛、眉毛、鼻子、嘴、牙齿的轮廓,以及人脸的中轴线
Image Alignment Analysis
: 图像对比分析Barcode Detection
: 二维码/条形码检测
- 用于查找和识别图像中的条码
- 检测条形码信息
Text Detection
: 文字检测
- 查找图像中可见文本的区域
- 检测文本区域的信息
Object Detection and Tracking
: 目标跟踪
- 脸部,矩形和通用模板
二. Vision支持的图片类型
1. Objective-C中
CVPixelBufferRef
CGImageRef
CIImage
NSURL
NSData
2. Swift中
CVPixelBuffer
CGImage
CIImage
URL
Data
具体详情可在
Vision.framework
的VNImageRequestHandler.h
文件中查看
三. Vision之API介绍
- 使用在
vision
的时候,我们首先需要明确自己需要什么效果,然后根据想要的效果来选择不同的类 - 给各种功能的
Request
提供给一个RequestHandler
Handler
持有需要识别的图片信息,并将处理结果分发给每个Request
的completion Block
中- 可以从
results
属性中得到Observation
数组 observations
数组中的内容根据不同的request请求返回了不同的observation
- 每种
Observation
有boundingBox
,landmarks
等属性,存储的是识别后物体的坐标,点位等 - 我们拿到坐标后,就可以进行一些UI绘制。
1. RequestHandler
处理请求对象
VNImageRequestHandler
: 处理与单个图像有关的一个或多个图像分析请求的对象
- 一般情况下都是用该类处理识别请求
- 初始化方法支持
CVPixelBuffer
,CGImage
,CIImage
,URL
,Data
VNSequenceRequestHandler
: 处理与多个图像序列有关的图像分析请求的对象
- 目前我在处理物体跟踪的时候使用该类
- 初始化方法同上
2. VNRequest介绍
VNRequest
: 图像分析请求的抽象类, 继承于NSObject
VNBaseImageRequest
: 专注于图像的特定部分的分析请求
- 具体分析请求类如下:
3. VNObservation
检测对象
VNObservation
: 图像分析结果的抽象类, 继承与NSObject
- 图像检测结果的相关处理类如下:
四. 实战演练
1. 文本检测
- 方式一: 识别出具体的每一个字体的位置信息
- 方式二: 识别一行字体的位置信息
- 如图效果:
1.1 现将图片转成初始化VNImageRequestHandler
对象时, 可接受的的CIImage
//1. 转成ciimage
guard let ciImage = CIImage(image: image) else { return }
1.2 创建处理请求的handle
- 参数一: 图片类型
- 参数二: 字典类型, 有默认值为[:]
let requestHandle = VNImageRequestHandler(ciImage: ciImage, options: [:])
1.3 创建回调闭包
- 两个参数, 无返回值
VNRequest
: 是所有请求Request的父类
public typealias VNRequestCompletionHandler = (VNRequest, Error?) -> Swift.Void
- 具体代码如下:
//4. 设置回调
let completionHandle: VNRequestCo