Google Cloud Vision API处理弧形文本时的文本乱序与坐标异常问题
Google Cloud Vision API 弧形文本识别乱序问题解决思路
问题现象
识别常规水平排版文本无异常,但处理弧形文本时,返回的文本片段完全乱序,无法匹配原图顺序;同时返回JSON中的boundingPoly顶点坐标逻辑不符合预期,无法直接用于排序文本。
部分返回数据示例
{ "boundingPoly": { "vertices": [ {"x": 395,"y": 21}, {"x": 421,"y": 18}, {"x": 423,"y": 39}, {"x": 398,"y": 42} ] }, "description": "on" }, { "boundingPoly": { "vertices": [ {"x": 442,"y": 16}, {"x": 482,"y": 11}, {"x": 484,"y": 31}, {"x": 444,"y": 36} ] }, "description": "the" }, { "boundingPoly": { "vertices": [ {"x": 263,"y": 22}, {"x": 297,"y": 18}, {"x": 300,"y": 45}, {"x": 266,"y": 49} ] }, "description": "all" }, { "boundingPoly": { "vertices": [ {"x": 316,"y": 15}, {"x": 382,"y": 7}, {"x": 385,"y": 35}, {"x": 319,"y": 43} ] }, "description": "items" }, { "boundingPoly": { "vertices": [ {"x": 330,"y": 57}, {"x": 399,"y": 61}, {"x": 397,"y": 99}, {"x": 328,"y": 95} ] }, "description": "have" }, { "boundingPoly": { "vertices": [ {"x": 420,"y": 63}, {"x": 501,"y": 68}, {"x": 499,"y": 105}, {"x": 418,"y": 100} ] }, "description": "impact" }
解决方案
1. 基于弧形路径的自定义排序
Google Vision返回的文本片段没有内置弧形排序逻辑,需要自己计算排序:
- 计算每个文本块
boundingPoly的中心点坐标:center_x = (v1.x + v2.x + v3.x + v4.x)/4,center_y = (v1.y + v2.y + v3.y + v4.y)/4 - 确定弧形的圆心坐标(可通过图像分析工具提取,或手动标注)
- 计算每个中心点相对于圆心的极角(使用
atan2(center_y - center_y0, center_x - center_x0)) - 按极角从小到大(或从大到小,根据弧形方向)排序文本片段,即可还原原图顺序
2. 切换到DOCUMENT_TEXT_DETECTION模式
默认的TEXT_DETECTION更侧重零散文本提取,DOCUMENT_TEXT_DETECTION针对文档类复杂排版优化,会尝试保留文本的空间布局关系:
- 调用API时指定
feature.type = DOCUMENT_TEXT_DETECTION - 该模式返回的结果会按页面布局分组,可能直接输出符合弧形顺序的文本
3. 图像预处理:将弧形文本矫正为水平
如果上述方法效果不佳,可先对图像进行预处理:
- 使用OpenCV等工具,定位弧形文本区域,通过透视变换或弧形展开算法(如基于极坐标转换)将弧形文本转为水平排列
- 对矫正后的图像调用Vision API,即可得到顺序正确的识别结果
内容的提问来源于stack exchange,提问作者Gops
相关产品推荐
相关产品推荐

