swift中VNDetectBarcodesRequest VNImageRequestHandler 是什么?有什么作用?VN是什么意思

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

在 Swift 中,VNDetectBarcodesRequestVNImageRequestHandlerVision 框架 中的类,用于计算机视觉任务。VNVision 的缩写。

Vision 框架概述

Vision 框架是 Apple 提供的用于执行计算机视觉任务的框架,包括:

  • 人脸检测

  • 条码识别

  • 文字识别

  • 图像分析

  • 目标跟踪等

VNImageRequestHandler - 图像请求处理器

作用:用于处理图像并执行 Vision 请求

Swift 复制代码
import Vision
import UIKit

// 创建图像请求处理器
let image = UIImage(named: "barcode_image")
guard let cgImage = image?.cgImage else { return }

let requestHandler = VNImageRequestHandler(cgImage: cgImage)

// 也可以从其他来源创建
let requestHandlerFromURL = VNImageRequestHandler(url: imageURL)
let requestHandlerFromCIImage = VNImageRequestHandler(ciImage: ciImage)
let requestHandlerFromBuffer = VNImageRequestHandler(cvPixelBuffer: pixelBuffer)

// 执行请求
do {
    try requestHandler.perform([barcodeRequest, textRequest])
} catch {
    print("处理失败: \(error)")
}

VNDetectBarcodesRequest - 条码检测请求

作用:专门用于检测和识别图像中的条码

Swift 复制代码
// 创建条码检测请求
let barcodeRequest = VNDetectBarcodesRequest { request, error in
    if let error = error {
        print("条码检测错误: \(error)")
        return
    }
    
    // 处理检测结果
    guard let results = request.results as? [VNBarcodeObservation] else { return }
    
    for observation in results {
        print("检测到条码:")
        print("类型: \(observation.symbology.rawValue)")
        print("内容: \(observation.payloadStringValue ?? "无内容")")
        print("位置: \(observation.boundingBox)")
        
        // 获取条码的角点坐标
        if let corners = observation.topLeft, 
           let topRight = observation.topRight,
           let bottomLeft = observation.bottomLeft,
           let bottomRight = observation.bottomRight {
            print("角点坐标: \(corners), \(topRight), \(bottomLeft), \(bottomRight)")
        }
    }
}

// 配置请求选项(可选)
barcodeRequest.revision = VNDetectBarcodesRequestRevision1
// 设置识别的条码类型
barcodeRequest.symbologies = [.QR, .code128, .EAN13]

完整使用示例

Swift 复制代码
import Vision
import UIKit

class BarcodeScanner {
    func detectBarcodes(in image: UIImage) {
        guard let cgImage = image.cgImage else { return }
        
        // 创建条码检测请求
        let barcodeRequest = VNDetectBarcodesRequest { request, error in
            self.handleBarcodeResults(request: request, error: error)
        }
        
        // 配置条码类型
        barcodeRequest.symbologies = [.QR, .PDF417, .code128]
        
        // 创建图像处理器并执行请求
        let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
        
        do {
            try requestHandler.perform([barcodeRequest])
        } catch {
            print("条码检测失败: \(error)")
        }
    }
    
    private func handleBarcodeResults(request: VNRequest, error: Error?) {
        if let error = error {
            print("处理错误: \(error)")
            return
        }
        
        guard let results = request.results as? [VNBarcodeObservation] else {
            print("未检测到条码")
            return
        }
        
        for barcode in results {
            print("""
            检测到条码:
            类型: \(barcode.symbology.rawValue)
            内容: \(barcode.payloadStringValue ?? "N/A")
            置信度: \(barcode.confidence)
            """)
            
            // 在真实应用中,这里可以处理条码数据
            if let payload = barcode.payloadStringValue {
                processBarcodePayload(payload, type: barcode.symbology)
            }
        }
    }
    
    private func processBarcodePayload(_ payload: String, type: VNBarcodeSymbology) {
        switch type {
        case .QR:
            print("QR码内容: \(payload)")
            // 处理 URL、联系方式等
        case .code128:
            print Code128 内容: \(payload)")
            // 处理商品编码等
        default:
            print("未知类型的条码: \(payload)")
        }
    }
}

支持的条码类型

Vision 框架支持多种条码类型:

Swift 复制代码
let supportedSymbologies: [VNBarcodeSymbology] = [
    .Aztec,        // Aztec 码
    .code39,       // Code 39
    .code93,       // Code 93
    .code128,      // Code 128
    .dataMatrix,   // 数据矩阵码
    .EAN8,         // EAN-8
    .EAN13,        // EAN-13
    .PDF417,       // PDF417
    .QR,           // QR 码
    .UPCE,         // UPC-E
    .ITF14,        // ITF-14
    .codabar       // Codabar
]

其他常用的 Vision 请求

除了条码检测,Vision 框架还提供其他检测功能:

Swift 复制代码
// 文字识别
let textRequest = VNRecognizeTextRequest { request, error in
    // 处理识别到的文字
}

// 人脸检测
let faceRequest = VNDetectFaceRectanglesRequest { request, error in
    // 处理检测到的人脸
}

// 物体检测
let objectRequest = VNDetectRectanglesRequest { request, error in
    // 处理检测到的矩形物体
}

// 同时执行多个请求
do {
    try requestHandler.perform([barcodeRequest, textRequest, faceRequest])
} catch {
    print("请求执行失败: \(error)")
}

优势特点

  1. 高性能: 利用设备的神经网络引擎

  2. 准确度高: 基于机器学习模型

  3. 易于使用: 简单的 API 设计

  4. 实时处理: 支持摄像头实时流处理

  5. 隐私保护: 在设备端处理,数据不上传

Vision 框架为 iOS/macOS 应用提供了强大的计算机视觉能力,让开发者可以轻松实现条码识别、文字识别等复杂功能。
大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~

相关推荐
加个鸡腿儿1 小时前
React项目实战 | 修复Table可展开行,点击一个全部展开
前端·react.js·编程语言
在泡泡里1 小时前
前端规范【五】biomejs自动化工具-ultracite
前端
_野猪佩奇_牛马版1 小时前
node/py实现 qwen多轮对话
前端
残冬醉离殇1 小时前
函数柯里化(curry)是什么?🤔
前端·javascript
1024小神1 小时前
在 Vision 框架中,request.results 是什么类型的数据
前端
亮子AI2 小时前
【CSS】cursor: auto, default, none 有什么区别?
前端·css
晴殇i2 小时前
代码隔离革命:用 JavaScript Realm 安全运行不可信代码
前端·javascript
Mr.Jessy2 小时前
Web APIs 学习第六天:BOM、location对象与本地存储
开发语言·前端·javascript·学习·web api·bom
百***92652 小时前
Node.js npm 安装过程中 EBUSY 错误的分析与解决方案
前端·npm·node.js