使用 Google 的文本识别 API 检测图像中的水平线而不是块

Posted

技术标签:

【中文标题】使用 Google 的文本识别 API 检测图像中的水平线而不是块【英文标题】:Using Google's Text Recognition API to detect horizontal lines instead of blocks in images 【发布时间】:2018-08-08 20:35:49 【问题描述】:

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

...因为到目前为止,API 检测块中的文本,而不是像这样以任意顺序检测文本:

... 不,TextBlock 的 getComponents() 仅检索每个 TextBlock 中的行,因为 TextBlock 位于文本层次结构的顶部(TextBlock 包含行),如文档 here 中所述。如果这个 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)
    

【问题讨论】:

您无法直接从 OCR 获取数据行。无论如何,您可以应用算法并从 OCR 生成数据行。 你有没有在这个@DaveNOTDavid 上取得任何进展? 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于使用 Google 的文本识别 API 检测图像中的水平线而不是块的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Vision Api 检测块内的所有文本

google vision api 可以从图像中识别代码文本(例如 javascript)吗?

Google Vision Api 支持 PDF 和 TIFF 文本检测,但它也可以与包含图像的 PDf 一起使用吗?

如何使用 google vision api 从图像中进行文本检测?

谷歌视觉 api 文本检测

Google Vision API 文本检测奇怪行为 - Javascript