VNRecognizeAnimalsRequest
和 VNRecognizeTextRequest
,这两个类是 Vision
框架中的一部分,用于图像识别任务,分别用于动物识别和文本识别。我们将深入探讨这两个请求类的属性、方法以及如何在 Swift 中使用它们。
1. VNRecognizeAnimalsRequest
VNRecognizeAnimalsRequest
是一个基于机器学习的视觉请求,用于识别图像中的动物。这个请求会尝试识别图像中的动物类别,并返回包含动物类别的识别结果。
主要属性和方法
init(completionHandler:)
:初始化 VNRecognizeAnimalsRequest
请求。你需要传入一个回调处理函数,用于处理识别结果。
results
:返回图像中所有识别到的动物。结果类型是一个数组,包含 VNRecognizedObjectObservation
对象。
代码示例:如何使用 VNRecognizeAnimalsRequest
func recognizeObjects(in image: UIImage) {
// 1. 转换 UIImage 为 CIImage
guard let ciImage = CIImage(image: image) else {
print("Failed to create CIImage from UIImage")
return
}
// 2. 加载机器学习模型 (这里假设使用内置模型,实际中可以自定义模型)
let request = VNRecognizeTextRequest { request, error in
// 3. 处理识别结果
if let error = error {
print("Error during recognition: \(error.localizedDescription)")
return
}
guard let results = request.results as? [VNRecognizedObjectObservation] else {
print("No objects found")
return
}
// 4. 输出识别到的物体
for observation in results {
self.handleRecognitionResult(observation)
}
}
//VNRecognizeTextRequest(completionHandler: <#T##VNRequestCompletionHandler?##VNRequestCompletionHandler?##(VNRequest, (any Error)?) -> Void#>)
// 5. 配置识别请求的级别
//request.recognitionLevel = .accurate
// 6. 创建请求处理器并执行请求
let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])
do {
try handler.perform([request])
} catch {
print("Failed to perform request: \(error.localizedDescription)")
}
}
func handleRecognitionResult(_ observation: VNRecognizedObjectObservation) {
// 获取物体的框架和置信度
let boundingBox = observation.boundingBox
let confidence = observation.confidence
// 获取物体标签(识别结果)
let labels = observation.labels
print("Recognized object with confidence \(confidence): \(labels)")
// 可以进一步处理或展示这些数据
// 例如,你可以在 UI 中展示物体的识别框
drawBoundingBox(boundingBox)
}
func drawBoundingBox(_ boundingBox: CGRect) {
// 假设你有一个 UIImageView 来显示图像
let imageView = UIImageView()
// 将相对坐标转换为实际图像的坐标
let boxFrame = CGRect(x: boundingBox.origin.x * imageView.bounds.width,
y: (1 - boundingBox.origin.y - boundingBox.height) * imageView.bounds.height,
width: boundingBox.width * imageView.bounds.width,
height: boundingBox.height * imageView.bounds.height)
// 创建并绘制矩形框
let boxView = UIView(frame: boxFrame)
boxView.layer.borderColor = UIColor.red.cgColor
boxView.layer.borderWidth = 2
imageView.addSubview(boxView)
}
代码解释:
VNRecognizeAnimalsRequest
:该请求用于识别图像中的动物。你传入一个回调处理函数,当识别完成时回调。
VNRecognizedObjectObservation
:返回的每个观察包含识别的标签和置信度。
VNImageRequestHandler
:负责执行请求。
2. VNRecognizeTextRequest
VNRecognizeTextRequest
用于识别图像中的文本内容,能够提取文本信息并返回。这个请求非常适合用于 OCR
任务,可以识别图像中的各种文本(包括多种语言)。
主要属性和方法
init(completionHandler:)
:初始化 VNRecognizeTextRequest
请求,传入一个回调处理函数,用于处理识别到的文本。
results
:返回识别到的文本结果,类型为 VNRecognizedTextObservation 数组。每个 VNRecognizedTextObservation
对象包含识别到的文本内容。
recognitionLevel
:设置识别的精度,选项有:
VNRequestRecognitionLevel.fast
:较快的识别,可能会牺牲一些精度。
VNRequestRecognitionLevel.accurate
:精确的文本识别,速度较慢,但精度较高。
minimumTextHeight
:设置最小文本高度,低于此高度的文本将不会被识别。
customWords
:设置自定义词库(可选),用于改进识别结果。
代码示例:如何使用 VNRecognizeTextRequest
func recognizeObjects(in image: UIImage) {
// 1. 转换 UIImage 为 CIImage
guard let ciImage = CIImage(image: image) else {
print("Failed to create CIImage from UIImage")
return
}
// 2. 加载机器学习模型 (这里假设使用内置模型,实际中可以自定义模型)
let request = VNRecognizeTextRequest { request, error in
// 3. 处理识别结果
if let error = error {
print("Error during recognition: \(error.localizedDescription)")
return
}
guard let results = request.results as? [VNRecognizedObjectObservation] else {
print("No objects found")
return
}
// 4. 输出识别到的物体
for observation in results {
self.handleRecognitionResult(observation)
}
}
//VNRecognizeTextRequest(completionHandler: <#T##VNRequestCompletionHandler?##VNRequestCompletionHandler?##(VNRequest, (any Error)?) -> Void#>)
// 5. 配置识别请求的级别
request.recognitionLevel = .accurate
// 6. 创建请求处理器并执行请求
let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])
do {
try handler.perform([request])
} catch {
print("Failed to perform request: \(error.localizedDescription)")
}
}
func handleRecognitionResult(_ observation: VNRecognizedObjectObservation) {
// 获取物体的框架和置信度
let boundingBox = observation.boundingBox
let confidence = observation.confidence
// 获取物体标签(识别结果)
let labels = observation.labels
print("Recognized object with confidence \(confidence): \(labels)")
// 可以进一步处理或展示这些数据
// 例如,你可以在 UI 中展示物体的识别框
drawBoundingBox(boundingBox)
}
func drawBoundingBox(_ boundingBox: CGRect) {
// 假设你有一个 UIImageView 来显示图像
let imageView = UIImageView()
// 将相对坐标转换为实际图像的坐标
let boxFrame = CGRect(x: boundingBox.origin.x * imageView.bounds.width,
y: (1 - boundingBox.origin.y - boundingBox.height) * imageView.bounds.height,
width: boundingBox.width * imageView.bounds.width,
height: boundingBox.height * imageView.bounds.height)
// 创建并绘制矩形框
let boxView = UIView(frame: boxFrame)
boxView.layer.borderColor = UIColor.red.cgColor
boxView.layer.borderWidth = 2
imageView.addSubview(boxView)
}
import Vision
import UIKit
func recognizeText(in image: UIImage) {
guard let ciImage = CIImage(image: image) else {
print("Failed to create CIImage from UIImage")
return
}
// 创建文本识别请求
let request = VNRecognizeTextRequest { request, error in
if let error = error {
print("Error during text recognition: \(error.localizedDescription)")
return
}
// 获取识别结果
guard let results = request.results as? [VNRecognizedTextObservation] else {
print("No text found")
return
}
// 输出识别到的文本
for observation in results {
self.handleTextRecognitionResult(observation)
}
}
// 设置识别级别
request.recognitionLevel = .accurate
// 可选:设置最小文本高度
request.minimumTextHeight = 0.1
// 执行请求
let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])
do {
try handler.perform([request])
} catch {
print("Failed to perform text recognition request: \(error.localizedDescription)")
}
}
// 处理识别结果
func handleTextRecognitionResult(_ observation: VNRecognizedTextObservation) {
// 获取识别到的文本
let topCandidate = observation.topCandidates(1).first
if let recognizedText = topCandidate?.string {
print("Recognized text: \(recognizedText)")
}
}
代码解释:
VNRecognizeTextRequest
:用于识别图像中的文本内容。你传入一个回调函数,当识别完成时回调。
recognitionLevel
:可以选择快速或精确的文本识别。
VNRecognizedTextObservation
:返回每个文本块的识别信息,其中包含识别到的文本内容。
topCandidates(_:)
:VNRecognizedTextObservation
提供的方法,返回多个候选文本中的最佳文本(按置信度排序)。
3. 总结
VNRecognizeAnimalsRequest
主要功能:用于识别图像中的动物。
常用属性和方法:
recognitionLevel
:设置识别级别(fast
或 accurate
)。
results
:返回一个 VNRecognizedObjectObservation
数组,包含识别到的动物。
VNRecognizeTextRequest
主要功能:用于识别图像中的文本。
常用属性和方法:
recognitionLevel
:设置识别级别(fast
或 accurate
)。
minimumTextHeight
:设置最小文本高度。
customWords
:设置自定义词汇,优化识别结果。
results
:返回一个 VNRecognizedTextObservation
数组,包含识别到的文本。