在 Vision 框架中,request.results 是什么类型的数据

大家好,我的开源项目PakePlus可以将网页/Vue/React项目打包为桌面/手机应用并且小于5M只需几分钟,官网地址:pakeplus.com

在 Vision 框架中,request.results 的类型是 [VNObservation]?(可选的对象数组)。

基本类型

Swift 复制代码
// request.results 的基本类型
let results: [VNObservation]? = request.results

具体的子类类型

根据不同的 Vision 请求,results 数组中的对象会是不同的 VNObservation 子类:

1. 条码检测 - VNDetectBarcodesRequest

Swift 复制代码
let barcodeRequest = VNDetectBarcodesRequest { request, error in
    // 需要向下转型为具体的类型
    guard let results = request.results as? [VNBarcodeObservation] else { return }
    
    for barcode in results {
        print("条码类型: \(barcode.symbology.rawValue)")
        print("条码内容: \(barcode.payloadStringValue ?? "")")
        print("置信度: \(barcode.confidence)")
        print("边界框: \(barcode.boundingBox)")
    }
}

2. 文字识别 - VNRecognizeTextRequest

Swift 复制代码
let textRequest = VNRecognizeTextRequest { request, error in
    guard let results = request.results as? [VNRecognizedTextObservation] else { return }
    
    for observation in results {
        // 获取识别到的文字
        let topCandidates = observation.topCandidates(1)
        if let recognizedText = topCandidates.first {
            print("识别到的文字: \(recognizedText.string)")
            print("置信度: \(recognizedText.confidence)")
        }
    }
}

3. 人脸检测 - VNDetectFaceRectanglesRequest

Swift 复制代码
let faceRequest = VNDetectFaceRectanglesRequest { request, error in
    guard let results = request.results as? [VNFaceObservation] else { return }
    
    for face in results {
        print("人脸位置: \(face.boundingBox)")
        print("置信度: \(face.confidence)")
    }
}

4. 物体检测 - VNDetectRectanglesRequest

Swift 复制代码
let rectangleRequest = VNDetectRectanglesRequest { request, error in
    guard let results = request.results as? [VNRectangleObservation] else { return }
    
    for rectangle in results {
        print("矩形位置: \(rectangle.boundingBox)")
        print("左上角: \(rectangle.topLeft)")
        print("右上角: \(rectangle.topRight)")
        print("左下角: \(rectangle.bottomLeft)")
        print("右下角: \(rectangle.bottomRight)")
    }
}

完整的类型处理示例

Swift 复制代码
func handleVisionResults(request: VNRequest, error: Error?) {
    if let error = error {
        print("Vision 请求错误: \(error)")
        return
    }
    
    // 首先检查是否有结果
    guard let results = request.results, !results.isEmpty else {
        print("未检测到任何内容")
        return
    }
    
    // 根据请求类型处理不同的结果
    switch request {
    case is VNDetectBarcodesRequest:
        handleBarcodeResults(results as! [VNBarcodeObservation])
        
    case is VNRecognizeTextRequest:
        handleTextResults(results as! [VNRecognizedTextObservation])
        
    case is VNDetectFaceRectanglesRequest:
        handleFaceResults(results as! [VNFaceObservation])
        
    case is VNDetectRectanglesRequest:
        handleRectangleResults(results as! [VNRectangleObservation])
        
    default:
        print("未知的请求类型")
        // 通用处理
        for observation in results {
            print("检测到对象 - 置信度: \(observation.confidence), 位置: \(observation.boundingBox)")
        }
    }
}

安全处理类型转换

为了避免强制转型崩溃,建议使用安全的方式:

Swift 复制代码
func safeHandleResults(request: VNRequest) {
    guard let results = request.results else { return }
    
    // 安全的方式:使用条件转型
    if let barcodeResults = results as? [VNBarcodeObservation] {
        handleBarcodes(barcodeResults)
    } else if let textResults = results as? [VNRecognizedTextObservation] {
        handleText(textResults)
    } else if let faceResults = results as? [VNFaceObservation] {
        handleFaces(faceResults)
    } else {
        // 通用处理
        for observation in results {
            print("基础观察对象: \(observation)")
        }
    }
}

VNObservation 的通用属性

所有 VNObservation 子类都有一些通用属性:

Swift 复制代码
for observation in request.results ?? [] {
    print("UUID: \(observation.uuid)")
    print("置信度: \(observation.confidence)") // 0.0 到 1.0
    print("边界框: \(observation.boundingBox)") // 归一化坐标 (0,0 到 1,1)
    
    // 转换边界框到具体图像坐标
    let imageSize = CGSize(width: 1000, height: 800)
    let boundingBoxInPixels = VNImageRectForNormalizedRect(
        observation.boundingBox, 
        Int(imageSize.width), 
        Int(imageSize.height)
    )
    print("像素坐标: \(boundingBoxInPixels)")
}

总结

  • 基本类型 : [VNObservation]?

  • 需要向下转型 为具体的子类才能访问特定功能

  • 不同类型请求 返回不同的 VNObservation 子类

  • 总是可选类型,因为可能没有检测到任何内容

  • 包含通用属性 如置信度、边界框等

这种设计让 Vision 框架既保持了类型安全,又提供了统一的接口来处理各种计算机视觉任务。
大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~

相关推荐
百万蹄蹄向前冲3 小时前
Trae Genimi3跟着官网学实时通信 Socket.io框架
前端·后端·websocket
狂炫冰美式4 小时前
TRAE SOLO 驱动:重构AI模拟面试产品的复盘
前端·后端·面试
1024肥宅6 小时前
JavaScript 拷贝全解析:从浅拷贝到深拷贝的完整指南
前端·javascript·ecmascript 6
欧阳天风6 小时前
js实现鼠标横向滚动
开发语言·前端·javascript
局i7 小时前
Vue 指令详解:v-for、v-if、v-show 与 {{}} 的妙用
前端·javascript·vue.js
码界奇点7 小时前
Java Web学习 第15篇jQuery从入门到精通的万字深度解析
java·前端·学习·jquery
小鑫同学7 小时前
Alias Assistant:新一代 macOS Shell 别名管理解决方案
前端·前端工程化
꒰ঌ小武໒꒱7 小时前
RuoYi-Vue 前端环境搭建与部署完整教程
前端·javascript·vue.js·nginx
名字越长技术越强8 小时前
前端之相对路径
前端
望道同学8 小时前
PMP/信息系统项目管理师 9 张 思维导图【考试必备】
前端·后端·程序员