文本提取 - 逐行

时间:2017-02-22 12:06:41

标签: google-vision

我使用的是Google Vision API,主要用于提取文字。我工作正常,但对于我需要API来扫描输入行的特定情况,在移动到下一行之前吐出文本。但是,似乎API正在使用某种逻辑,使其在左侧从上到下扫描并向右侧扫描并进行从上到下的扫描。我希望如果API从左向右读,向下移动等等。

例如,考虑图像:

enter image description here

API返回如下文本:

“ Name DOB Gender: Lives In John Doe 01-Jan-1970 LA ”

然而,我会期待这样的事情:

“ Name: John Doe DOB: 01-Jan-1970 Gender: M Lives In: LA ”

我想有一种方法可以定义块大小或边距设置(?)来逐行读取图像/扫描?

感谢您的帮助。 亚历

3 个答案:

答案 0 :(得分:3)

这可能是一个迟到的答案,但添加它以供将来参考。 您可以向JSON请求添加功能提示以获得所需的结果。

{
  "requests": [
    {
      "image": {
        "source": {
          "imageUri": "https://i.stack.imgur.com/TRTXo.png"
        }
      },
      "features": [
        {
          "type": "DOCUMENT_TEXT_DETECTION"
        }
      ]
    }
  ]
}

对于相距很远的文本,DOCUMENT_TEXT_DETECTION也无法提供正确的分割。

以下code根据字符多边形坐标进行简单的线段分割。

enter image description here

https://github.com/sshniro/line-segmentation-algorithm-to-gcp-vision

答案 1 :(得分:0)

You can extract the text based on the bounds per line too, you can use boundyPoly and concatenate the text in the same line

"boundingPoly": {
        "vertices": [
          {
            "x": 87,
            "y": 148
          },
          {
            "x": 411,
            "y": 148
          },
          {
            "x": 411,
            "y": 206
          },
          {
            "x": 87,
            "y": 206
          }
        ]

for example this 2 words are in the same "line"

"description": "you",
      "boundingPoly": {
        "vertices": [
          {
            "x": 362,
            "y": 1406
          },
          {
            "x": 433,
            "y": 1406
          },
          {
            "x": 433,
            "y": 1448
          },
          {
            "x": 362,
            "y": 1448
          }
        ]
      }
    },
    {
      "description": "start",
      "boundingPoly": {
        "vertices": [
          {
            "x": 446,
            "y": 1406
          },
          {
            "x": 540,
            "y": 1406
          },
          {
            "x": 540,
            "y": 1448
          },
          {
            "x": 446,
            "y": 1448
          }
        ]
      }
    }

答案 2 :(得分:0)

这里有一个简单的代码,可以逐行读取。行的y轴和行中每个单词的x轴。

items = []
lines = {}

for text in response.text_annotations[1:]:
    top_x_axis = text.bounding_poly.vertices[0].x
    top_y_axis = text.bounding_poly.vertices[0].y
    bottom_y_axis = text.bounding_poly.vertices[3].y

    if top_y_axis not in lines:
        lines[top_y_axis] = [(top_y_axis, bottom_y_axis), []]

    for s_top_y_axis, s_item in lines.items():
        if top_y_axis < s_item[0][1]:
            lines[s_top_y_axis][1].append((top_x_axis, text.description))
            break

for _, item in lines.items():
    if item[1]:
        words = sorted(item[1], key=lambda t: t[0])
        items.append((item[0], ' '.join([word for _, word in words]), words))

print(items)