Android studio ocr初级app开发问题汇总(含工程代码)
博客第一篇文章,稍作修改,增加文字介绍
开发目的
最近由于某些需求,需要在Android手机端实现OCR功能,大致为通过手机照相,识别出相片中的中文信息字段。但是由于新手光环+流程不熟悉,遇到了各种各样的问题,准备在本文中叙述一下,最好能派上用场。
开发环境
Android studio 2.3.3 Windows下,测试手机Android4.4版本
环境搭建
使用的google提供的OCR识别引擎,可以选择多种语言。
参考上述链接可以实现,最开始的搭建。这里需要注意的是:由于GitHub上的工程与当前新建的Gradle版本不匹配,导致android-maven错误,注意添加依赖。
大文件拷贝
由于OCR训练好的文件比较大,以中文识别为例,50MB左右大小,需要将文件放置于手机的SD卡中,便于TessBaseApi对象初始化。(init()函数需要文件路径,目前没想到更好的方式)。
本文提出的解决方式:首先将chi_sim.traineddata文件放入asset文件夹中。在程序首次运行的时候,将文件拷贝到SD卡中,注意获取SD卡读写权限。拷贝函数如下:

加入相机
以上步骤顺利的话,可以实现对图片的文字进行识别功能。为了实现对照相机得到的相片进行识别,需要打开摄像机。
Intent getImageByCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(getImageByCamera,REQUST_ORIGINAL);
REQUST_ORIGINAL是自己定义的常量值,用于接收时,与requestcode值比对,判断是否为需要的数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == REQUST_ORIGINAL){
Bundle bdl = data.getExtras();
Bitmap bmp = (Bitmap) bdl.get("data");
ImageView im_camera = (ImageView)findViewById(R.id.img_camera);
im_camera.setImageBitmap(bmp);
mTess.clear();
mTess.setImage(bmp);
String result = mTess.getUTF8Text();
TextView txtget = (TextView)findViewById(R.id.txt_get);
txtget.setText(result);
}
}
在回调函数里,处理返回的图片数据,就可以实现初步的图片文字识别。但是这样返回的图片数据为缩略图,清晰的很低。如果想要对原始图片进行处理的话,需要换一种图片获取的方式。
首先,调用相机的时候,添加图片为文件存储的路径。
Intent getImageByCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri;
if(Build.VERSION.SDK_INT>=24)
{
File g= new File(picPath);//测试错误
try {
g.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
uri = FileProvider.getUriForFile(this,"xueyu404",g);
}else{
uri = Uri.fromFile(new File(picPath));
} getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT,uri);
startActivityForResult(getImageByCamera,REQUST_ORIGINAL);
PicPath为String变量,意义为相机图片在sd卡上的存储路径。然后在回调函数里对图片进行处理。
由于Android 7.0在跨应用数据调用增加了限制,需要使用FileProvider获取uri,具体FileProvider配置参考一下链接
http://blog.csdn.net/hehe26/article/details/52921056
if (resultCode == Activity.RESULT_OK && requestCode == REQUST_ORIGINAL){
FileInputStream fis = null;
try{
Log.e("sdpath2",picPath);
fis = new FileInputStream(picPath);
Bitmap bm = BitmapFactory.decodeStream(fis);
ImageView im_camera = (ImageView)findViewById(R.id.img_camera);
im_camera.setImageBitmap(bm);
mTess.setImage(bm );
String result = mTess.getUTF8Text();
TextView txtget = (TextView)findViewById(R.id.txt_get);
txtget.setText(result);
}catch (FileNotFoundException e){
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
else {
Toast.makeText(this,"没有拍到照片",Toast.LENGTH_SHORT).show();
}
运行效率
通过上述的过程,可以完成,基本的文字识别的功能。但仍然存在着不能忽略的问题。
一,使用缩略图进行识别的时候,运行速率可以接受,对于特别大的文字识别还可以。但是由于图片被压缩过,如果图片中存在比较小的文字基本不能识别。
二,使用后面提到的原始图片进行识别的话,由于手机的计算能力有限,识别的计算过程相当耗时。识别过程要放到另外的线程中单独运行,否则会卡死UI线程,假死。但是即使新建线程,需要的时间也远超用户的忍耐限度。
改进优化
由于图片原图比较大的原因,对整个图片进行识别的效果也不理想。所以本文建议在拍摄照片之后,用户用手指圈定识别区域文字。圈定区域 的控件,见我的另外一篇博客
此外,识别过程,控件初始化过程比较耗时,放置在UI线程中卡顿不可忍耐。本文采用线程池的方式,处理上述两个过程。
最终效果图

先点击相机拍照按钮,拍要识别的照片,再点击选取区域按钮,用手指画一个矩形框,圈好识别区域(如果矩形没画好可以再点击选取区域重新画),
最后点击文字识别等待结果显示。
工程代码链接:https://github.com/dutxueyu/Android_ocr_app
Android studio ocr初级app开发问题汇总(含工程代码)的更多相关文章
- android软件简约记账app开发day04-记账页面条目的代码书写
android软件简约记账app开发day04-记账页面条目的代码书写 在前三天我们完成了基本的界面展示,从今天开始,我们进入到后台逻辑代码的编写中,今天开发记账条目的代码 我们在主页面点击记一笔图标 ...
- Android Studio搭建系统App开发环境
一.前言 在Android的体系中开发普通app使用Android Studio这一利器会非常的方便.但是开发系统app可能就会有些吃力,不过经过一些配置仍然会 很简单.我们知道系统app因为涉及到一 ...
- 在Android studio中进行NDK开发
在Android studio中进行NDK开发 分类: Android平台 软硬件环境 ubuntu kylin 14.04 红米note增强版 Android studio 0.8.6 ndk ...
- Android进阶(十九)AndroidAPP开发问题汇总(三)
Android进阶(十九)AndroidAPP开发问题汇总(三) Java解析XML的几种方式: http://inotgaoshou.iteye.com/blog/1012188 从线程返回数据的两 ...
- Android Studio入门(安装-->开发调试)
写在前面的话:本文来源:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–&g ...
- 如何将Android Studio与华为软件开发云代码仓库无缝对接(二)
上篇文章:如何将Android Studio与华为软件开发云代码仓库无缝对接(一) 上一章讲了,如何用Android Studio以软件开发云代码仓库为基础,新建一个项目.接下来,这一章继续讲建好项目 ...
- Android进阶(二十)AndroidAPP开发问题汇总(四)
· Android进阶(二十)AndroidAPP开发问题汇总(四) android:layout_width和android:width的区别 基中的android:layout_width和and ...
- Android进阶(十八)AndroidAPP开发问题汇总(二)
Android进阶(十八)AndroidAPP开发问题汇总(二) 端口被占用解决措施: Android使用SimpleAdapter更新ListView里面的Drawable元素: http://ww ...
- 【Android Studio安装部署系列】二十八、Android Studio查看其它APP的布局结构
概述 日常使用别家的APP过程中,会遇到一些比较好看的布局,这时候我们就想学习一下别人的布局结构,以便参考. (1)手机连接电脑.设置手机为USB调试模式 参考<[Android Studio安 ...
随机推荐
- WPF中使用TextBlock的Inlines属性来完成复杂的文字内容
参考:http://blog.csdn.net/zhangjiyehandsom/article/details/5498845 1. 需求:要在一行内容中显示不同颜色以及粗细不一的字体, 解决办法: ...
- jdk1.8 HashMap源码讲解
1. 开篇名义 jdk1.8中hashMap发生了一些改变,在之前的版本中hsahMap的组成是数组+链表的形式体现,而在1.8中则改为数组+链表+红黑树的形式实现,通过下面两张图来对比一下二者的不同 ...
- 理解Flexbox:你需要知道的一切
这篇文章介绍了Flexbox模块所有基本概念,而且是介绍Flexbox模块的很好的一篇文章,所以这篇文章非常的长,你要有所准备. 学习Flexbox的曲线 @Philip Roberts在Twitte ...
- String.IsNullOrEmpty 与 String.IsNullOrWhiteSpace
String.IsNullOrEmpty 指示指定的字符串是否为 null 或者 空字符串: 返回值:如果参数为 null 或者 空字符串("" .String.Empty),结果 ...
- web弹出对话框
Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('请输入 ...
- golang广度优先算法-走迷宫
广度优先遍历,走迷宫思路: 1.创建二维数组,0表示是路,1表示是墙:创建队列Q,存储可遍历的点,Q的第一个元素为起始点 2.从队列中取一个点,开始,按上.左.下.右的顺序遍历周围的点next,nex ...
- Springboot简介01
前言: spring是近几年java中最具有代表而且最为流行的框架,spring是基于aop和IOC的思想,在我们的项目中充当了一个粘合剂的作用,既可以成为对象工厂,来管理我们的controller. ...
- 面试遇到的mysql面试题
1.MySQL数据库有哪些内置函数?1.数学函数 2.字符串函数 3.日期和时间函数 4.条件判断函数5.系统信息函数 6.加密和压缩函数 7.聚合函数8.格式或类型转化函数. 2.如何返回一张表的数 ...
- order by 和group by同时使用
- Eclipse3.2查找jre的问题
前几天遇到一个问题,最开始电脑上使用的是解压的JDK(带jre),但是不能打开jar文件.所以从网上下载了一个jre1.8,然后问题来了,Eclipse打开就报错,弹出一个框,在eclipse的目录下 ...