Tesseract是遵守Apache License 2.0协议的开源OCR引擎。这里介绍下如何在Android平台编译Tesseract,以及如何快速创建一个简单的OCR应用。

参考原文:Making an Android OCR Application with Tesseract

Tesseract Android Tools

要编译Android平台的Tesseract,需要使用Google提供的tesseract-android-tools。

代码获取方式:

gitclonehttps://code.google.com/p/tesseract-android-tools/

打开README,在命令行工具中执行下面的步骤:

cd<project-directory>curl-Ohttps://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gzcurl-Ohttp://leptonica.googlecode.com/files/leptonica-1.69.tar.gztar-zxvftesseract-ocr-3.02.02.tar.gztar-zxvfleptonica-1.69.tar.gzrm-ftesseract-ocr-3.02.02.tar.gzrm-fleptonica-1.69.tar.gzmvtesseract-3.02.02jni/com_googlecode_tesseract_android/srcmvleptonica-1.69jni/com_googlecode_leptonica_android/srcndk-build-j8androidupdateproject--target1--path.antdebug(release)

注意:如果你在使用NDK r9,编译的时候会出现错误:

formatnotastringliteralandnoformatarguments[-Werror=format-security]

解决的方法就是在Application.mk中加入一行:

APP_CFLAGS+=-Wno-error=format-security

编译之后会生成class.jar和一些*.so。

Android OCR Application

创建一个Android应用,把生成的jar和so导入进来。

创建TessOCR

publicclassTessOCR{privateTessBaseAPImTess;publicTessOCR(){//TODOAuto-generatedconstructorstubmTess=newTessBaseAPI();Stringdatapath=Environment.getExternalStorageDirectory()+"/tesseract/";Stringlanguage="eng";Filedir=newFile(datapath+"tessdata/");if(!dir.exists())dir.mkdirs();mTess.init(datapath,language);}publicStringgetOCRResult(Bitmapbitmap){mTess.setImage(bitmap);Stringresult=mTess.getUTF8Text();returnresult;}publicvoidonDestroy(){if(mTess!=null)mTess.end();}}

构造函数中需要在存储卡上创建一个目录tessdata,如果不创建程序运行就会出错。因为源码中会检测这个目录,不存在就抛出异常:

publicbooleaninit(Stringdatapath,Stringlanguage){if(datapath==null){thrownewIllegalArgumentException("Datapathmustnotbenull!");}if(!datapath.endsWith(File.separator)){datapath+=File.separator;}Filetessdata=newFile(datapath+"tessdata");if(!tessdata.exists()||!tessdata.isDirectory()){thrownewIllegalArgumentException("Datapathmustcontainsubfoldertessdata!");}returnnativeInit(datapath,language);}

就这么简单。现在通过三种方式获取图片做OCR:

在图库中选取一张图,选择发送或者分享,选择OCR应用

在AndroidManifest.xml中加入IntentFilter,让OCR应用出现在图库的分享列表中:

<intent-filter><actionandroid:name="android.intent.action.SEND"/><categoryandroid:name="android.intent.category.DEFAULT"/><dataandroid:mimeType="text/plain"/><dataandroid:mimeType="image/*"/></intent-filter>

获得URI之后,对URI解码,获取bitmap:

if(Intent.ACTION_SEND.equals(intent.getAction())){Uriuri=(Uri)intent.getParcelableExtra(Intent.EXTRA_STREAM);uriOCR(uri);}privatevoiduriOCR(Uriuri){if(uri!=null){InputStreamis=null;try{is=getContentResolver().openInputStream(uri);Bitmapbitmap=BitmapFactory.decodeStream(is);mImage.setImageBitmap(bitmap);doOCR(bitmap);}catch(FileNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{if(is!=null){try{is.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}}}

启动OCR应用,从图库中选择一张图做OCR

发送Intent调用图库,在onActivityResult中获取返回的URI做OCR:

Intentintent=newIntent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent,REQUEST_PICK_PHOTO);

启动OCR应用,拍照之后做OCR

为了获取高质量的图片,在Intent中加入图片路径。返回之后就可以直接使用这个图片路径解码:

privatevoiddispatchTakePictureIntent(){IntenttakePictureIntent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);//Ensurethatthere'sacameraactivitytohandletheintentif(takePictureIntent.resolveActivity(getPackageManager())!=null){//CreatetheFilewherethephotoshouldgoFilephotoFile=null;try{photoFile=createImageFile();}catch(IOExceptionex){//ErroroccurredwhilecreatingtheFile}//ContinueonlyiftheFilewassuccessfullycreatedif(photoFile!=null){takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile));startActivityForResult(takePictureIntent,REQUEST_TAKE_PHOTO);}}}

最后不要忘记下载语言包,并push到存储卡的tessdata目录下。

源码

https://github.com/DynamsoftRD/android-tesseract-ocr

gitclonehttps://github.com/DynamsoftRD/android-tesseract-ocr.git




更多相关文章

  1. Android添加(创建)、删除及判断是否存在桌面快捷方式的方法
  2. android获取自定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度
  3. android编译某个模块
  4. Android(安卓)FrameWork——PackageManager框架
  5. ubuntu android 编译环境设置
  6. Android原生调用mui里面的js如何实现
  7. wakelock的使用
  8. Android之xml解析和json解析
  9. Android(安卓)Studio 使用 System.loadLibrary()的一些问题

随机推荐

  1. Android(安卓)任务、进程和线程
  2. Android(安卓)自定义camera压缩图片到指
  3. Android数据存取之Preferences
  4. Android(安卓)JNI开发入门之二
  5. android的简单理解(原创)
  6. Android自动化测试工具——Monkey
  7. android翻译应用、地图轨迹、视频广告、R
  8. android中cursor的使用
  9. 一个逆向程序猿的必备技能(Android)
  10. Android学习之sqlit