如何通过Tesseract开源OCR引擎创建Android OCR应用

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

代码获取方式:

git clone https://code.google.com/p/tesseract-android-tools/

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

cd <project-directory>
curl -O https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gz
curl -O http://leptonica.googlecode.com/files/leptonica-1.69.tar.gz
tar -zxvf tesseract-ocr-3.02.02.tar.gz
tar -zxvf leptonica-1.69.tar.gz
rm -f tesseract-ocr-3.02.02.tar.gz
rm -f leptonica-1.69.tar.gz
mv tesseract-3.02.02 jni/com_googlecode_tesseract_android/src
mv leptonica-1.69 jni/com_googlecode_leptonica_android/src
ndk-build -j8
android update project --target 1 --path .
ant debug (release)

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

format not a string literal and no format arguments [-Werror=format-security]

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

APP_CFLAGS += -Wno-error=format-security

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

Android OCR Application

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

创建TessOCR

public class TessOCR {
    private TessBaseAPI mTess;
 
    public TessOCR() {
        // TODO Auto-generated constructor stub
        mTess = new TessBaseAPI();
        String datapath = Environment.getExternalStorageDirectory() + "/tesseract/";
        String language = "eng";
        File dir = new File(datapath + "tessdata/");
        if (!dir.exists()) 
            dir.mkdirs();
        mTess.init(datapath, language);
    }
 
    public String getOCRResult(Bitmap bitmap) {
 
        mTess.setImage(bitmap);
        String result = mTess.getUTF8Text();
 
        return result;
    }
 
    public void onDestroy() {
        if (mTess != null)
            mTess.end();
    }
 
}

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

public boolean init(String datapath, String language) {
        if (datapath == null) {
            throw new IllegalArgumentException("Data path must not be null!");
        }
        if (!datapath.endsWith(File.separator)) {
            datapath += File.separator;
        }
 
        File tessdata = new File(datapath + "tessdata");
        if (!tessdata.exists() || !tessdata.isDirectory()) {
            throw new IllegalArgumentException("Data path must contain subfolder tessdata!");
        }
 
        return nativeInit(datapath, language);
    }

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

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

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

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

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

if (Intent.ACTION_SEND.equals(intent.getAction())) {
    Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
    uriOCR(uri);
}
private void uriOCR(Uri uri) {
        if (uri != null) {
            InputStream is = null;
            try {
                is = getContentResolver().openInputStream(uri);
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                mImage.setImageBitmap(bitmap);
                doOCR(bitmap);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
}

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

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

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

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

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

private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there‘s a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
 
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photoFile));
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }
}

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

源码

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

git clone https://github.com/DynamsoftRD/android-tesseract-ocr.git
时间: 2024-10-16 17:57:38

如何通过Tesseract开源OCR引擎创建Android OCR应用的相关文章

[转]Tesseract-OCR (Tesseract的OCR引擎最先由HP实验室于1985年开始研发)

光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷.打印行业的从业人员使用,可以快速的将纸质资料转换为电子资料.关于中文OCR,目前国内水平较高的有清华文通.汉王.尚书,其产品各有千秋,价格不菲.国外OCR发展较早,像一些大公司,如IBM.微软.HP等,即使没有推出单独的OCR产品,但是他们的研发团队早已掌握核心技术,将OCR功能植入了自身的软件系统.对于

Python下Tesseract Ocr引擎及安装介绍

1.Tesseract介绍 tesseract 是一个google支持的开源ocr项目,其项目地址:https://github.com/tesseract-ocr/tesseract,目前最新的源码可以在这里下载. 实际使用tesseract ocr也有两种方式:1- 动态库方式 libtesseract  2  - 执行程序方式 tesseract.exe 由于本人也是python菜鸟一个,所以方式1暂时不会,只好采取方式2. 2.Tesseract安装包下载 Tesseract的relea

Android 8款开源游戏引擎

1.Angle  (2D    Java) Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGLES技术开发.该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程. 最低运行环境要求不详. 项目地址:http://code.google.com/p/angle/ 2.Rokon  (2D    Java) rokon是一款Android 2D游戏引擎,基于OpenGL ES技术开

支持Android 的几款开源3D引擎调研

最近由于工作需要,对支持Android的一些开源3D引擎做了调研,结果如下: 1.Ogre 十分强大的一款3D引擎,号称工业级标准的开源项目,不仅可以用于游戏,还可以用于其他和3D相关的软件.大多数该有的功能都支持.Ogre只专注于做3D引擎,一些3D游戏中的常用功能例如:音效.碰撞/物理系统等都不支持. 优点:学习资料多,性能屌炸天,我试着运行过提供的sample app,效果非常棒,同时还能保持非常高的帧率. 缺点:C++编写的,想在Android系统上玩起来,自己要做不少封装的工作(sam

浅析android OCR文字识别

这学期有门课程老师要求用JAVA实现一个OCR文字识别的程序,所以就花了一些时间研究了一下在安卓端如何实现 OCR的引擎是用的开源项目tesseract-ocr 这个安卓版的地址:https://code.google.com/p/tesseract-android-tools/ 但是自己在编译的时候老是出错,于是在网上寻找到了别人编译好安卓可用的tess-two导入到项目中(参考文章地址 http://www.cnblogs.com/hangxin1940/archive/2012/01/13

开源游戏引擎哪家强?八款知名引擎资料够你忙

摘要:游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件.本文介绍了几款常见的开源游戏引擎,并附上相关资料. 游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始.以下介绍了几款常见的开源游戏引擎: OGRE OGRE是一个三维(3D)图形渲染引擎.它是面向对象的,并且高效,抽象化了不同的API和平台,这样可以以场景

6大主流开源SQL引擎总结,遥遥领先的是谁?

根据 O'Reilly 2016年数据科学薪资调查显示,SQL 是数据科学领域使用最广泛的语言.大部分项目都需要一些SQL 操作,甚至有一些只需要SQL.本文就带你来了解这些主流的开源SQL引擎!背景介绍 本文涵盖了6个开源领导者:Hive.Impala.Spark SQL.Drill.HAWQ 以及Presto,还加上Calcite.Kylin.Phoenix.Tajo 和Trafodion.以及2个商业化选择Oracle Big Data SQL 和IBM Big SQL,IBM 尚未将后者

细数隐藏在DevStore的五款开源游戏引擎

摘要:如今人人都在谈大数据,但是在开发的圈子里,"开源"也成了众开发者常谈的话题,不论是公司还是个人开发者都在开源,比如前阵子开源的"智游推送".由此看来,开源已渐渐成为趋势.本篇文章小编将为大家介绍几款深藏在DevStore的开源游戏引擎. 想必大家耳熟能详的游戏引擎要莫过于cocos2d-x.Unity3D或者OGEngine了,之前小编也有针对cocos2d-x和OGEngine的参数特性做过对比,大家也可参考一下.今天小编推荐的这5款游戏引擎虽没有像coco

开源工作流引擎 Workflow Core 的研究和使用教程

目录 开源工作流引擎 Workflow Core 的研究和使用教程 一,工作流对象和使用前说明 二,IStepBuilder 节点 三,工作流节点的逻辑和操作 容器操作 普通节点 事件 条件体和循环体 节点的异步或多线程 用于事务的操作 四,条件或开关 迭代 条件判断 节点并发 五,其它 开源工作流引擎 Workflow Core 的研究和使用教程 一,工作流对象和使用前说明 为了避免歧义,事先约定. 工作流有很多节点组成,一个节点成为步骤点(Step). 1,IWorkflow / IWork