Android OCR demo

最近因为工作的原因,好久没有写博客了。(看到有很多评论和留言,都不能一一回复啦~)

过年之前Oracle组织过一次内部的编程马拉松,当时选择的题目是OCR相关的,但是但是做出来的效果不是很好,就一直想着把代码重新整理一下,优化一下效果。

目前随着国内互联网火的一塌糊涂,似乎也带动了图像处理的发展与引用,以前一直觉得图像处理很难找到合适的工作,所以找工作的时候就换了自然语言处理,然后现在发现互联网招聘图像处理工程师也很多。。。

废话不多说,来看OCR on Android .

作OCR的话,需要使用一些已有的sdk, 例如tesseract,这个是Google的一个开源项目貌似国内访问这个比较费劲。

tesseract是C语言开发的,如果想要使用的Android平台上,需要通过Android平台的JNI调用机制,有兴趣的朋友可以参考:http://blog.csdn.net/watkinsong/article/details/9849973

对于大部分朋友来说,完全不需要直接操作底层的c语言,毕竟通过JNI调用非常难调试。 为了便于使用tesseract,github上有个叫tess-two的项目,把tesseract的底层API封装为Android平台可以直接使用的java API, 这样直接引用这个项目就可以直接进行OCR开发了。

如果不想看下面的罗嗦,直接下载我的Demo项目,直接看代码就可以了,下载地址: https://github.com/weixsong/libra, 注意,这是一个项目的集合,找到OCRDemo文件夹就是相应的项目。

第一步: 到 https://github.com/weixsong/tess-two 下载最新的tess-two项目,通过eclipse导入该羡慕

第二部:创建你自己的OCR项目,然后引用tess-two项目,这样就可以使用tess-two项目提供的API以及.so文件了。

第三步:到https://code.google.com/p/tesseract-ocr/, 下载你需要的对应的语言的已经训练好的训练数据(至于这个数据是模板,还是个神经网络,还是分类器。。。我不知道), 然后把训练数据放入Android 项目的 asset文件目录中,

需要注意的是,在写Android程序时,需要把训练好的分类文件拷贝到Android存储中:

private void checkAndCopyFiles() {
		String[] paths = new String[] { DATA_PATH, DATA_PATH_TESSDATA };
		for (String path : paths) {
			File dir = new File(path);
			if (!dir.exists()) {
				if (!dir.mkdirs()) {
					Log.v(TAG, "ERROR: Creation of directory " + path
							+ " on sdcard failed");
					return;
				} else {
					Log.v(TAG, "Created directory " + path + " on sdcard");
				}
			}
		}

		for (String lang : langs) {
			String traineddata_path = DATA_PATH_TESSDATA + lang
					+ ".traineddata";
			String asset_tessdata = "tessdata/" + lang + ".traineddata";

			if (!(new File(traineddata_path)).exists()) {
				try {
					AssetManager assetManager = getAssets();
					InputStream in = assetManager.open(asset_tessdata);
					OutputStream os = new FileOutputStream(traineddata_path);

					// Transfer bytes from in to out
					byte[] buf = new byte[1024];
					int len;
					while ((len = in.read(buf)) > 0) {
						os.write(buf, 0, len);
					}
					in.close();
					os.close();

					Log.v(TAG, "Copied " + lang + " traineddata");
				} catch (IOException e) {
					Log.e(TAG,
							"unable to copy " + lang + " traineddata "
									+ e.toString());
				}
			}
		}
	}

第四步:就可以使用tess-two进行OCR识别了,当然,你需要提供一张照片。。。

package com.example.homework;

import android.graphics.Bitmap;
import android.util.Log;

import com.googlecode.tesseract.android.TessBaseAPI;

public class TesstwoOCR {

	private static final String TAG = "TesstwoOCR";

	private TessBaseAPI ocr_eng;
	private TessBaseAPI ocr_chi;

	public TesstwoOCR() {
		Log.v(TAG, "BaseApi initializing...");

		ocr_eng = new TessBaseAPI();
		ocr_eng.setDebug(true);
		ocr_eng.init(MainActivity.DATA_PATH, MainActivity.LANG_EN);

		ocr_chi = new TessBaseAPI();
		ocr_chi.setDebug(true);
		ocr_chi.init(MainActivity.DATA_PATH, MainActivity.LANG_ZH);
	}

	public String doOCR(Bitmap bitmap, String lang) {

		String result = "";

		if (lang.equals(MainActivity.LANG_EN)) {
			ocr_eng.setImage(bitmap);
			result = ocr_eng.getUTF8Text();
		} else if (lang.equals(MainActivity.LANG_ZH)) {
			ocr_chi.setImage(bitmap);
			result = ocr_chi.getUTF8Text();
		} else {
			//nothing
		}

		return result.trim();
	}
}

上面的代码我分别使用了中文和英文的OCR识别,因为再我的Demo中可以进行中英文识别的切换。

因为这里给出了Demo的源代码, 所以整个过程描述的比较简单。大家还是尽量参考Demo代码进行对应的OCR识别的开发。 Demo 下载地址:https://github.com/weixsong/libra, 在源代码中,也有详细的如何使用该项目的说明。

下面是OCR识别的效果截图, 总体来说,目前的效果还是相当不错的:

时间: 2024-11-15 01:01:25

Android OCR demo的相关文章

android Junit demo

package com.sondon.dhjk.test; import com.sondon.dhjk.utils.LogUtil; import junit.framework.TestCase; public class Test extends TestCase { private static final String TAG = "Test"; /** * 构造函数 * @param name */ public Test(String name) { super(name

百度地图SDK for Android【Demo兴趣点搜索】

百度地图SDK为开发者提供了便捷的检索服务.今天我将为大家介绍Poi检索相关的内容. 首先,我们要构建一个最基本的地图应用,具体介绍请参考:百度地图SDK for Android[Demo地图展示] 在这个工程的基础之上我们做一定的修改. 第一步,修改布局文件,添加关键字输入框和用于执行搜索操作的按钮.代码如下: [html] view plaincopy <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/a

浅析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

Android Service demo例子使用详解

Android Service demo例子使用详解\ 概述Service 是 Android 的四大组件之一,它主要的作用是后台执行操作,Activity 属于带有 UI 界面跟用户进行交互,而 Service 则没有 UI 界面,所有的操作都是基于后台运行完成.并且 Service 跟 Activity 一样也是可以由其它的应用程序调用启动的,而且就算用户切换了应用程序,Service 依旧保持运行.一个组件如果与 Service 进行了绑定( bind ),就可以跟 Service 进行数

openwebrtc 服务端和android客户端demo安装

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46649667 转载请一定注明出处! 1,关于openwebrtc OpenWebRTC 是基于 Gstreamer 实现的开源的.跨平台的 WebRTC 客户端框架,支持 H.264 和 VP8.利用 OpenWebRTC,WebRTC就不再仅仅是纯粹浏览器技术了,你可以在NativeAPP中使用WebRTC,并且还可以与浏览器WebRTC互联互通. 2,安装服务端demo d

如何通过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 ht

【百度AR】【Android】demo工程使用手记

[百度AR][Android]demo工程使用手记 demo工程获取和注意事项 百度AR平台地址:https://ar.baidu.com/testapply 技术文档地址:https://ai.baidu.com/docs#/DuMixAR-Android-SDK/top AR内容管理地址:https://dumix.baidu.com/content SDK下载地址:https://ai.baidu.com/sdk#ar 注意:先注册百度账号,选择免费试用即可 Demo工程的运行配置 注意:

神目人脸识别Android SDK Demo说明

神目人脸识别Android SDK Demo说明1.Demo使用说明SDK Demo主界面如图1-1所示,主要功能有:1:1,1:N,人脸库管理,设置选项四大功能.具体说明如下:(1)1:1,即图片1与图片2进行人脸比对,得出两者的相似度分数.界面如图1-2所示,点击空白处的图片,进入图片选择界面,选择需要比对的人脸图片即可.注意:图片保持正向,建议尺寸低于1920 X 1080,人脸清晰.(2)1:N,使用该功能之前请至人脸库管理中进行人脸注册.注册完成以后,进入1:N,如图1-3所示,图中显

android经典Demo(转载)

一篇不错的资源博文,转载分享给大家: 1.Android团队提供的示例项目  如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发.由Android的核心开发团队提供了15个优秀的示例项目,包含了游戏.图像处理.时间显示.开始菜单快捷方式等.  地址: http://www.apkbus.com/android-13506-1-1.html 2. Remote Droid  RemoteDroid是一个Android应用,能够让用户