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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:24:04