Android Studio + Tesseract 详细配置教程

1、创建 Project

    选 Empty Activity,其它信息自己填。

2、配置

一、在 app 的 build.gradle 中添加依赖

    

implementation 'com.rmtheis:tess-two:8.0.0'

二、在 AndroidManifest.xml 中添加权限

    

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

3、下载 tesseract 的字库

    git 地址,这里只下两个,分别为简体中文的和英文的:chi_sim.traineddata 和 eng.traineddata。

    在 app/src/main 下创建 assets 文件夹,将下载好的两个字库拷进去。

    

4、测试

    准备好一张测试图片,这里为 nine.png: 。

    把这张图拷到 res/drawable 文件夹中。

    

    以下是 MainActivity.java 的源码,注释详尽,可直接运行。

package com.example.imgpstrtest;

import android.Manifest;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.googlecode.tesseract.android.TessBaseAPI;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class MainActivity extends AppCompatActivity {
    /* mDataPath 是字库在手机上的存储位置 */
    private String mDataPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tessdata/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getStorageAccessPermission(); // 获取权限
        File parentfile = new File(mDataPath);
        if (!parentfile.exists()){ // 确保路径存在
            parentfile.mkdir();
        }
        copyFiles(); // 复制字库到手机
        String lang = "chi_sim+eng"; // 使用简体中文 + 英文检测
        TessBaseAPI mTess = new TessBaseAPI();
        mTess.init(Environment.getExternalStorageDirectory().getAbsolutePath(), lang); // 初始化,第一个参数为 mDataPath 的父目录

        Long starttime = System.currentTimeMillis(); // 检测开始时间
        String OCRresult = null;
        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.nine); // 获取测试图片
        mTess.setImage(bitmap);
        OCRresult = mTess.getUTF8Text(); // 拿到字符串结果
        Long endtime = System.currentTimeMillis(); // 检测结束时间
        Log.e("test", OCRresult);
        Log.e("test", (endtime - starttime) + " ms");
    }

    private void copyFiles() {
        String[] datafilepaths = new String[]{mDataPath + "/chi_sim.traineddata", mDataPath + "/eng.traineddata"}; // 拷两个字库过去
        for (String datafilepath : datafilepaths) {
            copyFile(datafilepath);
        }
    }

    private void copyFile(String datafilepath) {
        try {
            String filepath = datafilepath;
            String[] filesegment = filepath.split(File.separator);
            String filename = filesegment[(filesegment.length - 1)]; // 获取字库文件名
            AssetManager assetManager = getAssets();
            InputStream instream = assetManager.open(filename); // 打开字库文件
            OutputStream outstream = new FileOutputStream(filepath);

            byte[] buffer = new byte[1024];
            int read;
            while ((read = instream.read(buffer)) != -1) {
                outstream.write(buffer, 0, read);
            }
            outstream.flush();
            outstream.close();
            instream.close();
            File file = new File(filepath);
            if (!file.exists()) {
                throw new FileNotFoundException();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void getStorageAccessPermission() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            // 没有获得授权,申请授权
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                Toast.makeText(MainActivity.this, "请先授权!", Toast.LENGTH_LONG).show();
            } else {
                // 不需要解释为何需要该权限,直接请求授权
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            }
        }
    }
}

5、参考

    https://blog.csdn.net/qq_33440246/article/details/78654871

    https://blog.csdn.net/danfengw/article/details/79231201

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章