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