iOS 15下VNRecognizeTextRequest文本识别结果顺序异常问题咨询
iOS 15 VNRecognizeTextRequest 文本识别结果顺序异常解决方案
首先明确:该问题是iOS 15.0 ~ 15.4版本Vision框架的原生系统级Bug,苹果已在iOS 15.5及后续系统版本中完成修复,非应用代码实现问题。
可选用的兼容方案如下:
方案1:系统版本适配
- 针对用户群体,可引导iOS 15版本低于15.5的用户升级系统,升级后识别结果顺序与iOS 14完全一致,无需修改应用代码。
方案2:手动对识别结果做坐标排序(兼容所有系统版本)
由于Vision框架返回的每个文本识别结果都附带原始坐标信息,可通过boundingBox属性自行对行顺序做校正,逻辑如下:
- Vision框架的坐标系原点在左下角,所以Y轴坐标越大,代表文本行在原图中的位置越靠上
- 先按Y轴坐标从大到小排序,区分上下行
- 若两个识别结果的Y轴坐标差小于设定阈值(推荐取行高的1/3,常规场景用0.03即可),判定为同一行内容,再按X轴坐标从小到大排序
- 最后按排序后的结果拼接文本即可
Swift代码示例:
func getSortedText(from observations: [VNRecognizedTextObservation]) -> String { let sortedObservations = observations.sorted { obsA, obsB in let yA = obsA.boundingBox.origin.y let yB = obsB.boundingBox.origin.y let lineHeightThreshold = 0.03 if abs(yA - yB) < lineHeightThreshold { // 同一行从左到右排序 return obsA.boundingBox.origin.x < obsB.boundingBox.origin.x } else { // 不同行从上到下排序 return yA > yB } } return sortedObservations.compactMap { $0.topCandidates(1).first?.string }.joined(separator: "\n") }
该方案兼容所有iOS版本,对多语言、复杂排版场景的排序校正效果稳定,性能损耗可忽略不计。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

