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 数组,包含识别到的文本。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容