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

在 Swift 中,VNDetectBarcodesRequest 和 VNImageRequestHandler 是 Vision 框架 中的类,用于计算机视觉任务。VN 是 Vision 的缩写。
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)")
}
优势特点
-
高性能: 利用设备的神经网络引擎
-
准确度高: 基于机器学习模型
-
易于使用: 简单的 API 设计
-
实时处理: 支持摄像头实时流处理
-
隐私保护: 在设备端处理,数据不上传
Vision 框架为 iOS/macOS 应用提供了强大的计算机视觉能力,让开发者可以轻松实现条码识别、文字识别等复杂功能。
大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~