android中ocr解决方案(tesseract)
2019独角兽企业重金招聘Python工程师标准>>>
android应用中ocr的解决方案大致有两种,而采用最多的还是tesseract.小弟就在这里将我最近两天解决思路写下来,如有缺陷,欢迎拍砖:
有两种解决方案,一种是采用tesseract cloud-service,这钟是把图片信息发送到云端,然后获得图片分析数据;第二种就是不用联网,本地化分析图片上信息。我就说说第二种,第一种我会在最后给大家一个链接(文章很不错)。
搜先就是下载Tesseract native android library.这里有两个链接,你选哪个链接都可以:
a.svn checkout http://tesseract-android-tools.googlecode.com/svn/trunk/ tesseract-android-tools。(如果不能checkout到,废话别说就到官方上下:http://code.google.com/p/tesseract-android-tools/)
b.可能上面一个下载后编译有些人会遇到一些问题,比如找不到jgep库,编译不成功。所以有了这个项目:git clone git://github.com/rmtheis/tess-two.git (这个包里面内容太多,不过也省得下那么多库了)
这里先说采用第一个源下载:下载成功后,打开README文件,做下修改(如下):
git clone git://android.git.kernel.org/platform/external/jpeg.git libjpeg
修改为:
git clone https://android.googlesource.com/platform/external/jpeg libjpeg
n
对于第二个源下载,由于里面没有README文件,操作命令如下:
cd <project-directory>/tess-two
export TESSERACT_PATH=${PWD}/external/tesseract-3.01
export LEPTONICA_PATH=${PWD}/external/leptonica-1.68
export LIBJPEG_PATH=${PWD}/external/libjpeg
ndk-build
android update project --path .
ant release
最终两个都得到你想要的libs里面的so文件和src里面的对so文件的封装类。这个就是我们开发所用到的东东啦。
然后新建工程,代码如下:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity ...";
private static final String TESSBASE_PATH = "/mnt/sdcard/tesseract/";
private static final String DEFAULT_LANGUAGE = "eng";
private static final String IMAGE_PATH = "/mnt/sdcard/test1.jpg";
private static final String EXPECTED_FILE = TESSBASE_PATH + "tessdata/" + DEFAULT_LANGUAGE
+ ".traineddata";
private TessBaseAPI service;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
testOcr();
}
public void testOcr(){
mHandler.post(new Runnable() {
@Override
public void run() {
Log.d(TAG, "begin>>>>>>>");
ocr();
//test();
}
});
}
public void test(){
// First, make sure the eng.traineddata file exists.
/*assertTrue("Make sure that you've copied " + DEFAULT_LANGUAGE + ".traineddata to "
+ EXPECTED_FILE, new File(EXPECTED_FILE).exists());*/
final TessBaseAPI baseApi = new TessBaseAPI();
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
final Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.test);
//digits is a .jpg image I found in one of the issues here.
ImageView img = (ImageView) findViewById(R.id.image);
img.setImageBitmap(bmp);//I can see the ImageView. So we know that it should work if I sent it to the setImage()
baseApi.setImage(bmp);
Log.v("Kishore","Kishore:Working");//This statement is never reached. Futhermore, on putting some more Log.v commands in the setImage function, I found out that the native function nativeSetImagePix is never accessed. I have attached the Logcat output below to show that it is not accessed.
String outputText = baseApi.getUTF8Text();
Log.v("Kishore","Kishore:"+outputText);
baseApi.end();
bmp.recycle();
}
protected void ocr() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(IMAGE_PATH, options);
try {
ExifInterface exif = new ExifInterface(IMAGE_PATH);
int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
Log.v(TAG, "Orient: " + exifOrientation);
int rotate = 0;
switch (exifOrientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
}
Log.v(TAG, "Rotation: " + rotate);
if (rotate != 0) {
// Getting width & height of the given image.
int w = bitmap.getWidth();
int h = bitmap.getHeight();
// Setting pre rotate
Matrix mtx = new Matrix();
mtx.preRotate(rotate);
// Rotating Bitmap
bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
// tesseract req. ARGB_8888
bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
}
} catch (IOException e) {
Log.e(TAG, "Rotate or coversion failed: " + e.toString());
}
ImageView iv = (ImageView) findViewById(R.id.image);
iv.setImageBitmap(bitmap);
iv.setVisibility(View.VISIBLE);
Log.v(TAG, "Before baseApi");
TessBaseAPI baseApi = new TessBaseAPI();
baseApi.setDebug(true);
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
baseApi.setImage(bitmap);
String recognizedText = baseApi.getUTF8Text();
baseApi.end();
Log.v(TAG, "OCR Result: " + recognizedText);
// clean up and show
if (DEFAULT_LANGUAGE.equalsIgnoreCase("eng")) {
recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9]+", " ");
}
if (recognizedText.length() != 0) {
((TextView) findViewById(R.id.field)).setText(recognizedText.trim());
}
}
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
};
};
}
当你很欢喜的运行程序的时候,发现事情没有你想象的那么简单。这个文件必须要用到一个语言包。不然你怎么匹配呢?想想也是:
adb shell mkdir /mnt/sdcard/tesseract
adb shell mkdir /mnt/sdcard/tesseract/tessdata
adb push eng.traineddata /mnt/sdcard/tesseract/tessdata/eng.traineddata
adb shell ls -l /mnt/sdcard/tesseract/tessdata
ls -l bin/tesseract-android-tools-test.apk
adb install -r -s bin/tesseract-android-tools-test.apk
adb shell am instrument -w -e class com.googlecode.tesseract.android.test.TessBaseAPITest
================================================================================
https://github.com/rmtheis/tess-two
转载于:https://my.oschina.net/u/188924/blog/516069
android中ocr解决方案(tesseract)相关推荐
- 【Dear imgui】ImGui输入框在Android中的解决方案
Dear ImGui本身是一个十分强大的GUI解决方案,但是目前为止,作者的回复仍然是DearImGui主要还是为PC进行服务,但是由于DearImGui本身使用底层图形API进行绘制,所以其跨平台性 ...
- python中ocr软件tesseract使用
首先要看原版的参考 https://github.com/madmaze/pytesseract 直接上代码, import pytesseractfrom PIL import Image imag ...
- android ocr java算法_Android OCR之tesseract
Android OCR之tesseract 1. 开源工具简介 tesseract是非常有名的开源OCR工具,但是要将它配置到Android开发环境中可能要费点功夫,别担心,github上面有好人帮助 ...
- android让组件贴着顶部,Android中底部菜单被输入法顶上去的解决方案
安卓手机输入法弹出,消失会触发 window.onresize事件,我们一般的解决方法是获取焦点,底部隐藏,失去焦点,底部菜单出现,但是,有些人会点击这个按钮收起键牌 那么,这个时候你的失去焦点无效, ...
- Android Studio开发过程中BUG解决方案——持续更新
Android Studio开发过程中BUG解决方案: android萌新打怪升级之旅:android项目开发BUG集成 起笔时间:2022.5.20 版本:2021.2.1 问题描述1:无法查看/d ...
- Android 中内存泄漏的原因和解决方案
之前研究过一段时间关于 Android 内存泄漏的知识,大致了解了导致内存泄漏的一些原因,但是没有深入去探究,很多细节也理解的不够透彻,基本上处于一种似懂非懂的状态,最近又研究了一波,发现有很多新的收 ...
- Android平台OCR工具之Tess-two使用
1.OCR简介 OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识 ...
- Windows安装用于OCR的Tesseract及使用命令行参数进行OCR
Windows安装用于OCR的Tesseract及使用命令行参数进行OCR 1. 效果图 2. Tesseract 安装及验证 参考 这篇博客将介绍如何安装和使用光学字符识别(OCR Optical ...
- Android中的JSON详细总结
1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...
最新文章
- 在双系统电脑再安装一个ubuntu18.04
- asterisk源码目录结构
- 14.Linux shell编程(函数)
- 复合高斯积分(节点数小于等于3的版本Python实现)
- 使用 Visual Studio Team Services 和 IIS 创建持续集成管道
- JZOJ 5385. 【NOIP2017提高A组模拟9.23】Carry
- python socket 大文件_python之socket运用之传输大文件
- java dom_Java DOM 解析 XML详解
- 数据结构十大排序算法(python)
- 怎么计算机械需要的电机,步进电机力矩的怎么计算?
- cdlinux中minidwep的使用
- android微信版本怎么升级,安卓微信怎么更新到最新版本?
- 如何把应用程序变成.exe执行文件
- TopCoder SRM 677 Div2
- 初学GWT-安装GWT
- 查看lv大小 linux,扩展AIX上的LV大小
- Spring创建Bean的基本步骤
- 【Delphi】微信支付控件(二)(半小时让您系统拥有支付功能)源代码、帮助文件、演示程序
- 锐捷睿易RAP100全新上市 WALL AP也有超高性能
- 本轮、均轮背后的傅里叶分解原理(matlab演示)