2

有没有办法使用谷歌的文本识别 API检测全尺寸的水平线(最大宽度)而不是图像中的文本块?比如说,如果我想从这样的收据图像中检索应付总额:

在此处输入图像描述

...因为到目前为止,API 会以任意顺序检测块中的文本,如下所示:

在此处输入图像描述

...不,TextBlockgetComponents()仅检索每个 TextBlock 中的行,因为 TextBlock 位于此处的文档中提到的文本层次结构的顶部(TextBlock 包含行) 。如果这个 API 可以从 Lines 而不是 TextBlocks 开始用于图像位图的框架......

我什至尝试使用硬编码坐标调整文本块的边界框(矩形)的大小,以希望检测到整行文本“Chicken Bowl ... 7.15”,但无济于事,如下所示:

val textRecognizer = TextRecognizer.Builder(this).build()
if (textRecognizer.isOperational) {
    val imageFrame = Frame.Builder()
                .setBitmap(imageBitmap)
                .build()
    val textBlocks = textRecognizer.detect(imageFrame)
    for (i in 0 until textBlocks.size()) {
        val textBlock = textBlocks.get(textBlocks.keyAt(i))
        textBlock.boundingBox.set(97, 1244, 1235, 1292)

        val textValue = textBlock.value
        Log.d(LOG_TAG, "textValue: " + textValue)
    }
}
4

1 回答 1

0

你是对的 - API 只是给你文本块的坐标和块内的行的坐标。因此,您必须自己整理所有行。

在开始之前,您应该以基线(或多或少)水平的方式旋转坐标。请注意,边界框的坐标有时顺序错误。当您计算所需的旋转角度时,您应该将这些误导性的框整理出来。

旋转所有坐标后,您可以开始匹配所有单词边界框并创建所需的线条。在我的代码中,我通过比较框的垂直中心来做到这一点。请注意高度非常小或非常大的片段(与平均高度相比)。你必须给他们特殊的待遇。

我可以向您保证,这适用于您的示例中所示的收据。

于 2020-04-19T08:08:36.730 回答