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

相关推荐
libolei1 分钟前
chrome浏览器安装axure插件
前端·chrome·chrome插件
黑臂麒麟9 分钟前
Electron&OpenHarmony 跨平台实战开发(一):electron-vite 与 Vue3 架构搭建指南
前端·javascript·electron·openharmony
少寒13 分钟前
深入理解JavaScript Promise:异步编程的基石
前端·javascript
tecwlcvi32315 分钟前
安卓版谷歌地图,Google地图高清版,谷歌地球,谷歌翻译,谷歌(Chrome)浏览器,手机版Edge,浏览器等安卓版浏览器下载
前端·chrome·edge
czlczl2002092516 分钟前
SpringBoot中web请求路径匹配的两种风格
java·前端·spring boot
2022.11.7始学前端23 分钟前
n8n第四节 表单触发器:让问卷提交自动触发企微消息推送
java·前端·数据库·n8n
m0_7400437323 分钟前
Axios 请求示例 res.data.data
前端·javascript·vue.js
程序员小寒25 分钟前
超详细的 EventLoop 解读及模拟实现
前端·javascript
冴羽27 分钟前
太好看了!3 个动漫变真人 Nano Banana Pro 提示词
前端·人工智能·aigc
zReadonly28 分钟前
关于vxeTable转换树状表格以及问题思考
前端