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

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