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

时间:2018-02-28 21:00:21

标签: android ocr google-vision android-vision text-recognition

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

enter image description here

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

enter image description here

...并且不,TextBlock' s getComponents()仅检索每个TextBlock中的Lines,因为TextBlock位于Text层次结构的顶部(TextBlock包含Line),如文档{{3}中所述}。如果只有这个API可以使用Lines而不是TextBlocks来开始图像位图的帧......

我甚至尝试调整文本块的大小。带有硬编码坐标的边界框(矩形)有望检测整行文字,#34;鸡碗...... 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)
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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

我可以向您保证,这可以与示例中显示的收据配合使用。