Android - 使用OCR的谷歌云视觉:显示检测到的文本

时间:2018-03-10 10:23:13

标签: java android ocr google-cloud-vision

我正在使用Google云端视觉OCR来检测文字。显示的文本始终是1.检测到的文本,2。每个检测到的单词。我只想显示检测到的文字。

我正在使用Google Cloud Platform Github中的代码,我在labelDetection.setType("TEXT_DETECTION");方法中将类型设置为文本检测callCloudVision

我还将convertResponseToString方法修改为:

private String convertResponseToString(BatchAnnotateImagesResponse response) {
        String message = "";

        List<EntityAnnotation> labels = response.getResponses().get(0).getTextAnnotations();
        for (EntityAnnotation label : labels) {
            if (labels != null) {
                System.out.println(label.getDescription());
                message += String.format(Locale.US, "%s", label.getDescription()) + "\n";
            }
            else
            {
                message += "nothing";
            }
        }
        return message;
    }

这是我的傻瓜:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    defaultConfig {
        applicationId "com.example.mhci"
        minSdkVersion 24
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
        javaCompileOptions {
            annotationProcessorOptions {
                includeCompileClasspath false
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/io.netty.versions.properties'
        exclude 'META-INF/INDEX.LIST'
        exclude 'META-INF/DEPENDENCIES'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'

    androidTestCompile('com.android.support.test.espresso:espresso-core:3.0.1', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    compile 'com.android.support:appcompat-v7:25.1.1'
    compile 'com.android.support:design:25.4.0'

    compile 'com.google.api-client:google-api-client-android:1.20.0' exclude module: 'httpclient'
    compile 'com.google.http-client:google-http-client-gson:1.20.0' exclude module: 'httpclient'

    compile 'com.google.apis:google-api-services-vision:v1-rev2-1.21.0'

    compile 'com.android.support:design:25.4.0'

    compile ('com.google.apis:google-api-services-translate:v2-rev47-1.22.0') {
        exclude group: 'com.google.guava'
    }

    compile ('com.google.cloud:google-cloud-translate:0.5.0') {
        exclude group: 'io.grpc', module: 'grpc-all'
        exclude group: 'com.google.protobuf', module: 'protobuf-java'
        exclude group: 'com.google.api-client', module: 'google-api-client-appengine'
    }
}

显示的this image检测到的文字是:

Hello world

Hello
world

但我希望它只显示Hello world

我该怎么做?

1 个答案:

答案 0 :(得分:0)

文本检测甚至可以用于此用例。问题是所有标签都返回了所有内容,这就是它的设计方式。你可以看一下如果你在一张图片(“主街”和“公园大道”)中并排说出两个街道标志,你会希望API能够分解它所看到的部分,这样就更有意义了。如果只返回一条“Main Street Park Avenue”字符串,则该信息无效。这就是为什么它总是返回整个事物然后返回它的所有部分,所以如果你通过返回的字符串进行查询,你会找到相关的图片。

所以基本上如果你相信它能正确地读取标签,你可以简单地使用返回数组中的第一个结果而不是全部3.或者你可以实现一些只显示最长和最可靠结果的逻辑

基本上,操纵返回的列表,列出标签,并提取所需的结果类型。在您的特定情况下,不要显示整个列表,只需获取列表中的第一个值,您就可以获得所需的内容。