在 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小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~

相关推荐
吃杠碰小鸡1 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone1 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09011 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农2 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king2 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
夏幻灵3 小时前
HTML5里最常用的十大标签
前端·html·html5
Mr Xu_3 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝3 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions3 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发3 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法