Vision专题之VNRecognizeAnimalsRequest和VNRecognizeAnimalsRequest

VNRecognizeAnimalsRequestVNRecognizeTextRequest,这两个类是 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:设置识别级别(fastaccurate)。
results:返回一个 VNRecognizedObjectObservation 数组,包含识别到的动物。

VNRecognizeTextRequest

主要功能:用于识别图像中的文本。
常用属性和方法:
recognitionLevel:设置识别级别(fastaccurate)。
minimumTextHeight:设置最小文本高度。
customWords:设置自定义词汇,优化识别结果。
results:返回一个 VNRecognizedTextObservation 数组,包含识别到的文本。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容