使用Vision框架的VNRecognizeTextRequest如何检测文本换行?
Vision框架文本识别换行符检测方案
VNRecognizeTextRequest 本身不会自动在返回的识别字符串中嵌入对应图片换行的\n符号,你当前的实现是直接将所有文本观测结果的首候选字符串用\n拼接,自然无法匹配图片真实的换行位置,可通过以下方式解决:
方案1:通过文本块坐标判定换行
Vision返回的每个VNTextObservation都带有boundingBox属性,标识该文本块在图片中的坐标范围(坐标原点为图片左下角),我们可以通过不同文本块的垂直坐标差判断是否属于不同行:
// 先将所有文本观测结果按y坐标降序排列,实现从上到下的读取顺序 let sortedObservations = observation.sorted { $0.boundingBox.origin.y > $1.boundingBox.origin.y } var finalText = "" var lastLineY: CGFloat? // 换行阈值可根据识别场景调整,一般取行高的0.2~0.4即可适配大多数场景 let lineBreakThreshold: CGFloat = 0.3 for textObs in sortedObservations { guard let currentText = textObs.topCandidates(1).first?.string else { continue } let currentY = textObs.boundingBox.origin.y let currentLineHeight = textObs.boundingBox.height if let lastY = lastLineY { // 相邻文本块垂直差超过阈值判定为换行,否则判定为同行文本文本 if lastY - currentY > currentLineHeight * lineBreakThreshold { finalText += "\n" } else { // 同行文本文本间添加空格分隔,不需要可删除该行 finalText += " " } } finalText += currentText lastLineY = currentY }
方案2:开启高精度识别适配单文本块内换行
如果你的识别场景中存在单个文本块内包含多行文本的情况,可将识别请求的精度等级设为高精度,部分场景下框架会自动在同块的识别结果中插入换行符:
let request = VNRecognizeTextRequest(completionHandler: yourHandler) request.recognitionLevel = .accurate request.usesLanguageCorrection = true
注意事项
如果待识别图片存在旋转、缩放的情况,需要先将boundingBox转换为图片实际坐标系再做计算,避免坐标判定出错。
内容的提问来源于stack exchange,提问作者Hassan Taleb
相关产品推荐
相关产品推荐

