Vision
框架是 Apple 提供的一个强大的图像分析框架,用于处理和分析图片或视频内容,主要用于计算机视觉任务,如面部识别、条形码扫描、文本识别、物体检测等。它是 iOS 和 macOS 应用程序中进行视觉处理和图像分析的首选工具,支持各种高效的图像识别操作。
1. Vision
框架概述
Vision
框架可以识别图像中的面部、条形码、文本、物体、场景等,并且可以在图片中标记出这些对象的位置。它与 Core ML 紧密集成,使得机器学习模型也能在图像处理中得到应用。
2. Vision 框架的基本概念
Vision
框架的核心功能通常依赖于几个重要的类和对象:
VNRequest
:表示一个视觉请求。请求通常是你希望框架执行的某种类型的任务(例如面部检测、条形码扫描等)。
VNSequenceRequestHandler
和 VNImageRequestHandler
:用于执行和处理请求。VNSequenceRequestHandler
用于视频帧的处理,而 VNImageRequestHandler
用于静态图像。
VNObservation
:表示框架处理图像后返回的结果。它们可以是图像中检测到的面部、文本或物体。
3. 常用 Vision 功能详解
3.1 人脸检测
使用 VNFaceObservation
类,Vision 可以对图片中的人脸进行检测并返回相应的位置。
示例代码:人脸检测
import Vision
import UIKit
func detectFaces(in image: UIImage) {
// 将 UIImage 转换为 CIImage
guard let ciImage = CIImage(image: image) else {
print("Failed to convert UIImage to CIImage")
return
}
// 创建人脸检测请求
let faceDetectionRequest = VNDetectFaceRectanglesRequest(completionHandler: handleFaces)
// 创建图像请求处理器
let requestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])
// 执行请求
do {
try requestHandler.perform([faceDetectionRequest])
} catch {
print("Failed to perform face detection request: \(error)")
}
}
// 处理人脸检测的回调
func handleFaces(request: VNRequest, error: Error?) {
guard let results = request.results as? [VNFaceObservation] else {
print("No faces detected")
return
}
for face in results {
// 打印每个检测到的面部区域
print("Face found at: \(face.boundingBox)")
}
}
3.2 条形码扫描
Vision
框架支持多种类型的条形码识别,包括 QR 码、UPC、EAN 等。使用 VNBarcodeObservation
可以提取条形码的数据。
示例代码:条形码扫描
import Vision
import UIKit
func detectBarcodes(in image: UIImage) {
guard let ciImage = CIImage(image: image) else {
print("Failed to convert UIImage to CIImage")
return
}
// 创建条形码识别请求
let barcodeRequest = VNDetectBarcodesRequest(completionHandler: handleBarcodes)
// 创建图像请求处理器
let requestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])
// 执行请求
do {
try requestHandler.perform([barcodeRequest])
} catch {
print("Failed to perform barcode detection request: \(error)")
}
}
// 处理条形码的回调
func handleBarcodes(request: VNRequest, error: Error?) {
guard let results = request.results as? [VNBarcodeObservation] else {
print("No barcodes detected")
return
}
for barcode in results {
print("Detected barcode: \(barcode.payloadStringValue ?? "Unknown")")
}
}
3.3 文本识别 (OCR)
VNRecognizeTextRequest
可以用于识别图像中的文本内容。你可以通过 Vision 来进行光学字符识别(OCR)。
示例代码:文本识别
import Vision
import UIKit
func detectText(in image: UIImage) {
guard let ciImage = CIImage(image: image) else {
print("Failed to convert UIImage to CIImage")
return
}
// 创建文本识别请求
let textRecognitionRequest = VNRecognizeTextRequest(completionHandler: handleText)
// 创建图像请求处理器
let requestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])
// 执行请求
do {
try requestHandler.perform([textRecognitionRequest])
} catch {
print("Failed to perform text recognition request: \(error)")
}
}
// 处理文本识别的回调
func handleText(request: VNRequest, error: Error?) {
guard let results = request.results as? [VNRecognizedTextObservation] else {
print("No text detected")
return
}
for observation in results {
// 输出识别到的文本内容
print("Recognized text: \(observation.topCandidates(1).first?.string ?? "No text")")
}
}
3.4 物体检测
物体检测功能通过与 Core ML 模型结合,利用预训练的深度学习模型进行物体检测。VNCoreMLRequest
是处理 Core ML 模型的 Vision 请求。
示例代码:物体检测
import Vision
import CoreML
import UIKit
func detectObjects(in image: UIImage) {
guard let ciImage = CIImage(image: image) else {
print("Failed to convert UIImage to CIImage")
return
}
// 加载 Core ML 模型
guard let model = try? VNCoreMLModel(for: YourMLModel().model) else {
print("Failed to load ML model")
return
}
// 创建物体检测请求
let objectDetectionRequest = VNCoreMLRequest(model: model, completionHandler: handleObjects)
// 创建图像请求处理器
let requestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])
// 执行请求
do {
try requestHandler.perform([objectDetectionRequest])
} catch {
print("Failed to perform object detection request: \(error)")
}
}
// 处理物体检测的回调
func handleObjects(request: VNRequest, error: Error?) {
guard let results = request.results as? [VNClassificationObservation] else {
print("No objects detected")
return
}
for result in results {
print("Detected object: \(result.identifier), confidence: \(result.confidence)")
}
}