API de OCR (reconocimiento óptico de caracteres) de Android 初探

Visión de conjunto

Algunos proyectos necesitan utilizar la función de reconocimiento de texto de imagen, requisitos básicos:

  • Soporte chino e inglés
  • Apoyar el reconocimiento local
  • gratis

Entorno de desarrollo:
plataforma Android Studio :
lenguaje Android : Java

selección del plan

De los resultados de búsqueda, la mayoría de los OCR son API en línea, varios requisitos de red durante el uso real, varios requisitos de pago, como un cierto grado. Dos soluciones disponibles que finalmente probé:

Código de referencia

Kit de AA de Firebase

  • Requisitos previos para su uso
    • Necesita crear un nuevo proyecto de Firebase backend de administración de Firebase
    • Descargue google-services.json y colóquelo en el directorio raíz del módulo del proyecto, como se muestra en la figura
      Inserte la descripción de la imagen aquí
    • El equipo de prueba debe ser compatible con GMS , es decir, hay un servicio de Google integrado.
    • Se recomienda conectarse a la red externa para iniciar sesión en la cuenta de Google
    • Una vez que la aplicación se está ejecutando, el servicio GMS detectará si admite OCR. Cuando el módulo no se encuentre o no sea compatible, descargará e instalará el soporte en línea. En el entorno doméstico, es muy difícil tener éxito una vez (si falla todo el tiempo , intente borrar los datos GMS , Inténtelo de nuevo, la referencia de LOG es la siguiente)
2020-01-02 09:45:51.554 1189-1277/com.google.android.gms.persistent W/ConfigurationChimeraPro: Caller is not authorized to access Uri: content://com.google.android.gms.phenotype/com.google.android.gms.vision.sdk -- metadata{ service_id: 51 }
2020-01-02 09:45:51.556 2640-2691/com.testgoogleocr.ocrservice W/DynamiteModule: Local module descriptor class for com.google.android.gms.vision.dynamite.ocr not found.
2020-01-02 09:45:51.561 1189-1277/com.google.android.gms.persistent W/ProviderHelper: Unknown dynamite feature vision.dynamite.ocr
2020-01-02 09:45:51.567 2640-2691/com.testgoogleocr.ocrservice I/DynamiteModule: Considering local module com.google.android.gms.vision.dynamite.ocr:0 and remote module com.google.android.gms.vision.dynamite.ocr:0
2020-01-02 09:45:51.567 2640-2691/com.testgoogleocr.ocrservice D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
2020-01-02 09:45:51.571 1189-1277/com.google.android.gms.persistent W/ProviderHelper: Unknown dynamite feature vision.ocr
2020-01-02 09:45:51.573 2640-2691/com.testgoogleocr.ocrservice W/DynamiteModule: Local module descriptor class for com.google.android.gms.vision.ocr not found.
2020-01-02 09:45:51.573 2640-2691/com.testgoogleocr.ocrservice I/DynamiteModule: Considering local module com.google.android.gms.vision.ocr:0 and remote module com.google.android.gms.vision.ocr:0
2020-01-02 09:45:51.574 2640-2691/com.testgoogleocr.ocrservice E/Vision: Error loading module com.google.android.gms.vision.ocr optional module true: com.google.android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module found. Local version is 0 and remote version is 0.
2020-01-02 09:45:51.575 2640-2691/com.testgoogleocr.ocrservice D/TextNativeHandle: Broadcasting download intent for dependency ocr
2020-01-02 09:45:51.586 2640-2691/com.testgoogleocr.ocrservice W/TextNativeHandle: Native handle not yet available. Reverting to no-op handle.
2020-01-02 09:45:51.617 1189-1277/com.google.android.gms.persistent W/ConfigurationChimeraPro: Caller is not authorized to access Uri: content://com.google.android.gms.phenotype/com.google.android.gms.clearcut.public -- metadata{ service_id: 51 }
2020-01-02 09:45:51.620 2640-2691/com.testgoogleocr.ocrservice W/DynamiteModule: Local module descriptor class for com.google.android.gms.vision.dynamite.ocr not found.
2020-01-02 09:45:51.627 1189-2278/com.google.android.gms.persistent W/ProviderHelper: Unknown dynamite feature vision.dynamite.ocr
2020-01-02 09:45:51.635 2640-2691/com.testgoogleocr.ocrservice I/DynamiteModule: Considering local module com.google.android.gms.vision.dynamite.ocr:0 and remote module com.google.android.gms.vision.dynamite.ocr:0
2020-01-02 09:45:51.635 2640-2691/com.testgoogleocr.ocrservice D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
2020-01-02 09:45:51.640 1189-2208/com.google.android.gms.persistent W/ProviderHelper: Unknown dynamite feature vision.ocr
2020-01-02 09:45:51.645 2640-2691/com.testgoogleocr.ocrservice W/DynamiteModule: Local module descriptor class for com.google.android.gms.vision.ocr not found.
2020-01-02 09:45:51.645 2640-2691/com.testgoogleocr.ocrservice I/DynamiteModule: Considering local module com.google.android.gms.vision.ocr:0 and remote module com.google.android.gms.vision.ocr:0
2020-01-02 09:45:51.646 2640-2691/com.testgoogleocr.ocrservice E/Vision: Error loading module com.google.android.gms.vision.ocr optional module true: com.google.android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module found. Local version is 0 and remote version is 0.
2020-01-02 09:45:51.649 2640-2640/com.testgoogleocr.ocrservice W/System.err: com.google.firebase.ml.common.FirebaseMLException: Waiting for the text recognition model to be downloaded. Please wait.
2020-01-02 09:45:51.651 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at com.google.android.gms.internal.firebase_ml.zzsc.zzd(com.google.firebase:firebase-ml-vision@@24.0.1:21)
2020-01-02 09:45:51.651 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at com.google.android.gms.internal.firebase_ml.zzsc.zza(com.google.firebase:firebase-ml-vision@@24.0.1:39)
2020-01-02 09:45:51.651 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at com.google.android.gms.internal.firebase_ml.zzpj.zza(com.google.firebase:firebase-ml-common@@22.0.1:31)
2020-01-02 09:45:51.652 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at com.google.android.gms.internal.firebase_ml.zzpl.call(com.google.firebase:firebase-ml-common@@22.0.1)
2020-01-02 09:45:51.652 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at com.google.android.gms.internal.firebase_ml.zzpf.zza(com.google.firebase:firebase-ml-common@@22.0.1:32)
2020-01-02 09:45:51.652 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at com.google.android.gms.internal.firebase_ml.zzpe.run(com.google.firebase:firebase-ml-common@@22.0.1)
2020-01-02 09:45:51.652 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at android.os.Handler.handleCallback(Handler.java:755)
2020-01-02 09:45:51.652 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
2020-01-02 09:45:51.652 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at com.google.android.gms.internal.firebase_ml.zze.dispatchMessage(com.google.firebase:firebase-ml-common@@22.0.1:6)
2020-01-02 09:45:51.652 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at android.os.Looper.loop(Looper.java:154)
2020-01-02 09:45:51.652 2640-2640/com.testgoogleocr.ocrservice W/System.err:     at android.os.HandlerThread.run(HandlerThread.java:61)
2020-01-02 09:45:51.673 1189-2696/com.google.android.gms.persistent I/CheckinUtil: Classify the device as Tablet.
2020-01-02 09:45:52.716 1455-2694/com.google.android.gms I/Vision: Details: ocr_armeabi_v7a.zip, a0fa9e293aa78a849c0951e9a9220ca9e9935bd9
2020-01-02 09:45:52.740 1455-2694/com.google.android.gms I/Vision: Engine already satisfied by existing download for ocr
2020-01-02 09:45:52.746 1189-2698/com.google.android.gms.persistent I/CheckinUtil: Classify the device as Tablet.
  • Únase al servicio de soporte de GMS: build.gradle en el directorio raíz del proyecto
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
		classpath 'com.google.gms:google-services:4.3.3'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

classpath 'com.google.gms: google-services: 4.3.3'

  • Build.gradle debajo del módulo
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    // ML Kit dependencies
    implementation 'com.google.firebase:firebase-ml-vision:24.0.1'
    // Barcode detection model.
    //implementation 'com.google.firebase:firebase-ml-vision-barcode-model:16.0.2'
    // Image Labeling model.
    //implementation 'com.google.firebase:firebase-ml-vision-image-label-model:19.0.0'
    // Face model
    //implementation 'com.google.firebase:firebase-ml-vision-face-model:19.0.0'
    // Custom model
    //implementation 'com.google.firebase:firebase-ml-model-interpreter:22.0.1'
    // Object model
    //implementation 'com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3'
    // AutoML model
    //implementation 'com.google.firebase:firebase-ml-vision-automl:18.0.3'
}
apply plugin: 'com.google.gms.google-services'
  • AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
    <application>
        <activity ></activity>
        <meta-data
            android:name="com.google.firebase.ml.vision.DEPENDENCIES"
            android:value="ocr" />

	</application>
  • Llamar a parte del código es relativamente simple
    public static String recorgnizeByFirebase(Context ctx, Bitmap bm){
    
    
        try {
    
    
            FirebaseApp.initializeApp(ctx);
            FirebaseVisionImage fImg = FirebaseVisionImage.fromBitmap(bm);//FirebaseVisionImage.fromFilePath(ctx, Uri.fromFile(new File(path)));
            FirebaseVisionTextRecognizer txtRec = FirebaseVision.getInstance().getOnDeviceTextRecognizer();
            txtRec.processImage(fImg).addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
    
    
                @Override
                public void onSuccess(FirebaseVisionText firebaseVisionText) {
    
    
                    Log.d("Firebase-vision", "onSuccess " + firebaseVisionText.getText());
                }
            }).addOnFailureListener(new OnFailureListener() {
    
    
                @Override
                public void onFailure(@NonNull Exception e) {
    
    
                    e.printStackTrace();
                }
            });
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return "";
    }

tess-two OCR

  • Descargue el archivo tessdata por adelantado

  • Coloque el archivo tessdata en el directorio especificado

  • Build.gradle debajo del módulo

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.rmtheis:tess-two:6.0.0'
}
  • TessOcr.java
package com.tessocr.ocrservice;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.os.Environment;
import android.os.SystemClock;

import com.googlecode.tesseract.android.TessBaseAPI;

import java.io.File;

public class TessOcr {
    
    
    static final boolean D = true;
    static void d(String msg){
    
    if(D)android.util.Log.d("TessOcr", "ALog > " + msg);}
    public static final String TESSBASE_PATH = Environment.getExternalStorageDirectory() + "/OcrService";
    public static final String TESSBASE_PATH_FULL = TESSBASE_PATH + "/tessdata";
    public static final String[] SUPPORT_LANGUAGE = {
    
    "eng", "chi_sim"};
    //Bitmap bm;
    private OnOcrResult lis;
    private TessBaseAPI ocrApi;


    public TessOcr(int lan, OnOcrResult lis){
    
    
        this.lis = lis;
        ocrApi = new TessBaseAPI();
        ocrApi.init(TESSBASE_PATH, SUPPORT_LANGUAGE[lan]);
    }

    public String startSync(String path, Rect area) {
    
    
        long st = SystemClock.uptimeMillis();
        d("startSync for " + path);
        String resString = "";
        //ocrApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
        ocrApi.setImage(new File(path));
        if(area != null)ocrApi.setRectangle(area);

        d("stage init api : " + (SystemClock.uptimeMillis() - st));
        resString = ocrApi.getUTF8Text();

        d("stage ocr done : " + (SystemClock.uptimeMillis() - st));

        ocrApi.clear();
        //ocrApi.end();

        return resString;
    }

    public void release(){
    
    
        if(ocrApi != null) ocrApi.end();
    }

    public void startAsync(final String path, final Rect area) {
    
    
        new Thread(){
    
    
            @Override
            public void run() {
    
    
                try {
    
    
                    String res = startSync(path, area);
                    if (lis != null) lis.onResult(res);
                }catch(Exception e){
    
    
                    if (lis != null) lis.onResult(null);
                }
            }
        }.start();
    }

    public interface OnOcrResult{
    
    
        void onResult(String res);
    }
}

Relacionado

Antecedentes de la administración de Firebase
Vea y comprenda texto usando OCR con Mobile Vision Text API para Android Tesseract tessdata tess -two de
Android OCR usa tess-two y cv4j para implementar funciones simples de OCR


Supongo que te gusta

Origin blog.csdn.net/ansondroider/article/details/103800947
Recomendado
Clasificación