Android之Tesseract OCR tess-two的使用

时间:2021-05-19 08:59:09

我的开发环境:win10     Android studio 2.2     ndk 版本r12b    手机:Honor  5x

第一步:下载文件

从githup下载:https://github.com/rmtheis/tess-two


第二步:编译出so文件

首先打开dos命令行  win+R 键,输入cmd,回车。

切换到下载的项目目录  例如:我下载的项目目录如下:Android之Tesseract OCR  tess-two的使用


Android之Tesseract OCR  tess-two的使用

如果没有配置ndk的环境变量需要这样编译:

例如:我的ndk路径:


Android之Tesseract OCR  tess-two的使用


编译命令如下:


Android之Tesseract OCR  tess-two的使用


执行命令后:


Android之Tesseract OCR  tess-two的使用


会依次编译armeabi  armea-v7a  arm64-v8a  mips  mips64 x86  x86——64    7种不同的so,编译时间大约40分钟。

编译好的so会保存在******\tess-two\libs目录下

Android之Tesseract OCR  tess-two的使用


Android之Tesseract OCR  tess-two的使用


第三步:导入so文件和java源码

1.如果你没有在build.gridle中重定向so目录,将armeabi  armeabi_v7a(一般这两个就可以了)复制到项目的src\main\jniLibs目录下(注意jniLibs的L是大写)。

2.导入java源码


Android之Tesseract OCR  tess-two的使用


复制com文件夹下面的所有文件到你的项目src\main\java目录下,这样做的好处是:不符合你要求的地方可以修改,打成jar包的话,只能查看源码不能修改。

我的教训:之前从网上下载别人编译好的so和jar遇到了很大的坑,所以希望我的读者朋友们自己去编译和配置开发环境。


第四部:配制语言包tessdata

将tessdata复制到手机内置存储的根目录下(当然其他目录也可以,需要在代码中指定路径)

语言包githup地址


第五部:简单使用

private static final String TESSBASE_PATH = Environment.getExternalStorageDirectory() + File.separator;
private static final String DEFAULT_LANGUAGE = "eng";//英文数据包
private static final String CHINESE_LANGUAGE = "chi_sim";//中文数据包
private static final String TAG = "TessTwoActivity";
TessBaseAPI baseApi = new TessBaseAPI();
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/text.jpg");
baseApi.setImage(bitmaps[0]);
final String outputText = baseApi.getUTF8Text();
Log.e(TAG, "识别结果:" + outputText );

至于TESSDATA_PATH为什么只指向了  根目录+“\”,可以从TessBaseAPI类的源码寻找答案,源码如下:

 /**
* Initializes the Tesseract engine with the specified language model(s). Returns
* <code>true</code> on success.
*
* @see #init(String, String)
*
* @param datapath the parent directory of tessdata ending in a forward
* slash
* @param language an ISO 639-3 string representing the language(s)
* @param ocrEngineMode the OCR engine mode to be set
* @return <code>true</code> on success
*/
public boolean init(String datapath, String language, int ocrEngineMode) {
if (datapath == null)
throw new IllegalArgumentException("Data path must not be null!");
if (!datapath.endsWith(File.separator))
datapath += File.separator;

File datapathFile = new File(datapath);
if (!datapathFile.exists())
throw new IllegalArgumentException("Data path does not exist!");
// 答案就在这里--------------------------
File tessdata = new File(datapath + "tessdata");
if (!tessdata.exists() || !tessdata.isDirectory())
throw new IllegalArgumentException("Data path must contain subfolder tessdata!");

//noinspection deprecation
if (ocrEngineMode != OEM_CUBE_ONLY) {
for (String languageCode : language.split("\\+")) {
if (!languageCode.startsWith("~")) {
File datafile = new File(tessdata + File.separator +
languageCode + ".traineddata");
if (!datafile.exists())
throw new IllegalArgumentException("Data file not found at " + datafile);
}
}
}

boolean success = nativeInitOem(mNativeData, datapath, language, ocrEngineMode);

if (success) {
mRecycled = false;
}

return success;
}


其他问题:

1.导入tess-two使用过程中,可能一言不合就崩溃,崩溃一次找到原因解决或者try  catch捕获异常应给出Toast 或其他提示信息。

推荐:

推荐一个githup上面的项目,简单描述一下:

打开摄像头,然后屏幕触摸调整识别框的大小,点击拍照后识别文字,有点像有道词典的摄像头识别单词。

githup下载地址android-ocr-master

参考:

Android OCR 之 tesseract

http://www.cnblogs.com/muyun/archive/2012/06/12/2546693.html