You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从VNRecognizedTextObservation获取高置信度文本的边界框?

解决文本识别观测对象与高置信度文本的关联问题

方法一:直接过滤原观测数组(推荐)

跳过单独提取候选文本的步骤,直接对原VNRecognizedTextObservation数组做过滤,基于其最优候选的置信度筛选,过滤结果直接是可用于获取坐标的观测对象。

guard let observations = request.results as? [VNRecognizedTextObservation] else { return }

// 筛选出最优候选置信度超过0.3的观测对象
let validObservations = observations.filter { observation in
    guard let topCandidate = observation.topCandidates(1).first else { return false }
    return topCandidate.confidence > 0.3
}

// 遍历使用:同时获取文本和坐标
for observation in validObservations {
    guard let recognizedText = observation.topCandidates(1).first?.string else { continue }
    // 获取绘制所需的坐标(如topRight)
    let topRightPoint = observation.topRight
    // 执行你的图形绘制逻辑
}

方法二:用元组绑定观测对象与候选文本

如果需要先保留候选文本的集合,可将原观测对象与对应候选文本打包成元组,过滤时保留完整关联关系。

guard let observations = request.results as? [VNRecognizedTextObservation] else { return }

// 将观测对象与它的最优候选文本配对成元组
let observationCandidatePairs = observations.compactMap { observation -> (VNRecognizedTextObservation, VNRecognizedText)? in
    guard let topCandidate = observation.topCandidates(1).first else { return nil }
    return (observation, topCandidate)
}

// 过滤置信度达标的配对项
let validPairs = observationCandidatePairs.filter { $0.1.confidence > 0.3 }

// 遍历使用
for (observation, candidate) in validPairs {
    let text = candidate.string
    let topRight = observation.topRight
    // 执行图形绘制逻辑
}

原问题的核心原因

你之前的流程中,compactMap只提取了候选文本,丢失了与原VNRecognizedTextObservation的关联,导致过滤后的confidenceL数组无法反向对应到原观测对象。上面两种方法都是通过保留原观测对象的引用解决关联问题,其中方法一的遍历次数更少,效率更高。

内容的提问来源于stack exchange,提问作者Hope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:18:21