我的开发环境:win10 Android studio 2.2 ndk 版本r12b 手机:Honor 5x
第一步:下载文件
从githup下载:https://github.com/rmtheis/tess-two
第二步:编译出so文件
首先打开dos命令行 win+R 键,输入cmd,回车。
切换到下载的项目目录 例如:我下载的项目目录如下:
如果没有配置ndk的环境变量需要这样编译:
例如:我的ndk路径:
编译命令如下:
执行命令后:
会依次编译armeabi armea-v7a arm64-v8a mips mips64 x86 x86——64 7种不同的so,编译时间大约40分钟。
编译好的so会保存在******\tess-two\libs目录下
第三步:导入so文件和java源码
1.如果你没有在build.gridle中重定向so目录,将armeabi armeabi_v7a(一般这两个就可以了)复制到项目的src\main\jniLibs目录下(注意jniLibs的L是大写)。
2.导入java源码
复制com文件夹下面的所有文件到你的项目src\main\java目录下,这样做的好处是:不符合你要求的地方可以修改,打成jar包的话,只能查看源码不能修改。
我的教训:之前从网上下载别人编译好的so和jar遇到了很大的坑,所以希望我的读者朋友们自己去编译和配置开发环境。
第四部:配制语言包tessdata
将tessdata复制到手机内置存储的根目录下(当然其他目录也可以,需要在代码中指定路径)
第五部:简单使用
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
参考:
http://www.cnblogs.com/muyun/archive/2012/06/12/2546693.html