如何从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
相关产品推荐
相关产品推荐

