来自边界框

时间:2016-12-05 22:37:20

标签: image-processing ocr google-vision

我正在尝试使用google vision api对我的图片执行OCR。 API调用的Json输出返回带有边界框信息的已识别单词。

有人可以告诉我如何使用此边界框信息对我的图像进行布局分析吗?

如果有一个库将其作为输入并返回句子而不是单词?

{
  "description": "Ingredients:",
  "boundingPoly": {
    "vertices": [
      {
        "x": 14,
        "y": 87
      },
      {
        "x": 53,
        "y": 87
      },
      {
        "x": 53,
        "y": 98
      },
      {
        "x": 14,
        "y": 98
      }
    ]
  }
},
{
  "description": "Chicken",
  "boundingPoly": {
    "vertices": [
      {
        "x": 55,
        "y": 87
      },
      {
        "x": 77,
        "y": 87
      },
      {
        "x": 77,
        "y": 98
      },
      {
        "x": 55,
        "y": 98
      }
    ]
  }
},

例如在上面的json中,单词' Ingredients:' '鸡'在同一条线上。是否有一个图书馆可以提供开箱即用的信息?

用于OCR source image

的图片

2 个答案:

答案 0 :(得分:1)

尝试使用Word或任何其他可让您旋转的工具旋转图像。 它在我的案例中得到了正确的答案,我不断阅读行中的所有内容。

答案 1 :(得分:0)

有几个client libraries可用于获取句子而不是单词。 github中也有官方可用的例子。例如,您可以看到here go语言示例文件。 detect.go包含按块输出文本的下一个函数:

    // detectDocumentText gets the full document text from the Vision API for an image at the given file path.
func detectDocumentTextURI(w io.Writer, file string) error {
    ctx := context.Background()

    client, err := vision.NewImageAnnotatorClient(ctx)
    if err != nil {
        return err
    }

    image := vision.NewImageFromURI(file)
    annotation, err := client.DetectDocumentText(ctx, image, nil)
    if err != nil {
        return err
    }

    if annotation == nil {
        fmt.Fprintln(w, "No text found.")
    } else {
        fmt.Fprintln(w, "Document Text:")
        fmt.Fprintf(w, "%q\n", annotation.Text)

        fmt.Fprintln(w, "Pages:")
        for _, page := range annotation.Pages {
            fmt.Fprintf(w, "\tConfidence: %f, Width: %d, Height: %d\n", page.Confidence, page.Width, page.Height)
            fmt.Fprintln(w, "\tBlocks:")
            for _, block := range page.Blocks {
                fmt.Fprintf(w, "\t\tConfidence: %f, Block type: %v\n", block.Confidence, block.BlockType)
                fmt.Fprintln(w, "\t\tParagraphs:")
                for _, paragraph := range block.Paragraphs {
                    fmt.Fprintf(w, "\t\t\tConfidence: %f", paragraph.Confidence)
                    fmt.Fprintln(w, "\t\t\tWords:")
                    for _, word := range paragraph.Words {
                        symbols := make([]string, len(word.Symbols))
                        for i, s := range word.Symbols {
                            symbols[i] = s.Text
                        }
                        wordText := strings.Join(symbols, "")
                        fmt.Fprintf(w, "\t\t\t\tConfidence: %f, Symbols: %s\n", word.Confidence, wordText)
                    }
                }
            }
        }
    }

    return nil
}