本篇博客是有了实时扫描识别的需求,然后看到了一篇博客,在其基础上按项目需求改进而成。感谢Si-Kang的贡献,基于交流进步的想法这里把我处理的一些问题写出来

转载地址:http://blog.csdn.net/mr_sk/article/details/72877492#comments

本篇博客Demo地址:http://download.csdn.net/detail/g_ying_jie/9883095

第一步集成:

compile 'com.rmtheis:tess-two:7.0.0'

第二步:下载tess-two的中文包,Demo中已经包含了。

第三步:声明权限,记得安卓6.0动态权限申请:

<uses-permission android:name="android.permission.CAMERA" /><!-- 声明使用Camera意图 --><uses-feature android:name="android.hardware.camera" /><!-- 声明调用Camera自动对焦功能 --><uses-feature android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第四步:获取读写权限后把字库从项目的assets目录复制到手机存储中,注意存储的路径一定要包含tessdata目录,因为在TessBaseAPI初始化的时候回去查找该目录

/**
* datapath是你传入的文字库路径,可以看到这里在传入的datapath后加了一个"tessdata"目录
* 然后验证了这个目录是否存在,如果不在,就会报错"数据目录必须包含tessdata目录"
*/File tessdata = new File(datapath + "tessdata");//tessdata是否存在且是个目录if (!tessdata.exists() || !tessdata.isDirectory())throw new IllegalArgumentException("Data path must contain subfolder tessdata!");
/*** 将assets中的识别库复制到SD卡中** @param path 要存放在SD卡中的 完整的文件名。这里是"/storage/emulated/0//tessdata/chi_sim.traineddata"* @param name assets中的文件名 这里是 "chi_sim.traineddata"*/public void copyToSD(String path, String name) {//如果存在就删掉File f = new File(path);if (f.exists()) {f.delete();}if (!f.exists()) {File p = new File(f.getParent());if (!p.exists()) {p.mkdirs();}try {f.createNewFile();} catch (IOException e) {e.printStackTrace();}}InputStream is = null;OutputStream os = null;try {is = this.getAssets().open(name);File file = new File(path);os = new FileOutputStream(file);byte[] bytes = new byte[2048];int len = 0;while ((len = is.read(bytes)) != -1) {os.write(bytes, 0, len);}os.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null)is.close();if (os != null)os.close();} catch (IOException e) {e.printStackTrace();}}}

第五步:利用surfaceview和camera实时预览画面,通过onPreviewFrame回调预览的帧画面,然后转化成bitmap传到TessBaseAPI进行异步识别。详细的流程请看Demo中的CameraView类。这里讲下我碰到的一些问题。

①测试需要,我想把实时预览的图片和解析后的内容通过Imageview和TextView展示出来,那么我的在CameraView中拿到CameraActivity的两个子控件,这里采用了CameraView的setTag方法,很多人可能都知道怎么去传一个,那怎么传递多个呢?

首先在strings文件加入两个key

<resources><string name="app_name">TestTessTwo</string><item name="tag_img" type="id"></item><item name="tag_text" type="id"></item>
</resources>

然后通过下面的方式setTag

cameraView.setTag(R.id.tag_text, tv_content);
cameraView.setTag(R.id.tag_img, img);

最后通过key获取对应的控件

imageView = (ImageView) getTag(R.id.tag_img);
textView = (TextView) getTag(R.id.tag_text);

②扫描动画TranslateAnimation的执行非常卡顿,主要是由于setPreviewCallback实时回调onPreviewFrame消耗了大量资源,并且onPreviewFrame的裁剪图片和解析内容过于耗时导致。

首先对于onPreviewFrame的图片及识别处理应该全部放到子线程中执行,可通过handler的方式回调子线程结果然后在主线程作相应处理。

然后setPreviewCallback以setPreviewCallbackWithBuffer替代,避免camera预览不断地开辟和回收内存。注意该方法要结合addCallbackBuffer使用,不然会出现只回调一次onPreviewFrame的情况,具体使用如下

开始预览前的处理,screenWidth和screenHeight是你确定的预览尺寸。可通过camera.getParameters().getPreviewSize();获取

mCamera.addCallbackBuffer(new byte[((screenWidth * screenHeight) * ImageFormat.getBitsPerPixel(ImageFormat.NV21)) / 8]);
mCamera.setPreviewCallbackWithBuffer(this);
mCamera.setPreviewDisplay(mHolder);//set the surface to be used for live preview
mCamera.startPreview();

然后在onPreviewFrame中添加camera.addCallbackBuffer(data);

/*** Camera帧数据回调用*/@Overridepublic void onPreviewFrame(final byte[] data, final Camera camera) {camera.addCallbackBuffer(data);new Thread(new Runnable() {@Overridepublic void run() {

好了就谈这么多吧,具体的运用在Demo中都有,有什么问题欢迎在评论留言讨论。

OCR实时扫描识别中英文--tess_two在Android的使用相关推荐

  1. UniAPP离线车牌实时扫描识别

    插件说明 Android离线车牌实时扫描识别 标签:车牌实时识别 车牌离线识别 车牌实时扫描 车牌离线扫描 车牌实时离线识别 车牌实时离线扫描 特点: 1.使用方便,引入即可: 2.响应快速,原生体验 ...

  2. OCR扫描识别录入之安卓Android行驶证驾驶证识别SDK

    现如今车辆走入了千家万户,已成为居民生活的必需品,而查驾照违章记录.缴纳违章罚款,也已经成了人们的生活常态了.而移动互联的发展,让这些以前需要跑银行.跑交警大队的事项,如今通过手机端就能解决了.但是手 ...

  3. [表格扫描OCR]快速扫描识别并获取表格图片内容[免费]

    我们常常会拿到一些别人拍照发给我们的表格.也许一开始我们仅仅是想知道表格里面的内容就可以了,但当我们拿到表格以后可能我们就会有更高的要求了,我们也许想把这个表格也打印出来.但又不想打印那个歪歪扭扭的表 ...

  4. Android名片扫描识别系统SDK

    Android名片扫描识别系统SDK 一.Android名片扫描识别系统应用背景 这些年,随着移动互联的发展,APP应用成爆发式的增长,在很多APP中都涉及到对名片信息的录入,如移动CRM.移动端OA ...

  5. android 名片识别 简书,名片扫描识别API

    关键词:名片识别 移动端名片识别 云端名片识别 服务器端名片识别 名片识别SDK 名片识别api 一.名片识别背景 随着计算机技术的迅猛发展,电子化的名片变得越来越流行, 交换变得越来越方便.利用手机 ...

  6. OCR--苹果ios安卓android身份证拍照扫描识别sdk

    一.ios安卓android身份证拍照扫描识别sdk应用背景 这些年,随着移动互联网的的发展,越来越多的企业都推出了自己的移动APP,这些APP多数都涉及到个人身份证信息的输入认证(即实名认证),如果 ...

  7. 智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》

    智能驾驶 车牌检测和识别(四)<Android实现车牌检测和识别(可实时车牌识别)> 目录 智能驾驶 车牌检测和识别(四)<Android实现车牌检测和识别(可实时车牌识别)> ...

  8. 移动手机端名片扫描识别技术

    一.移动手机端名片扫描识别技术应用背景 如今,随着移动手机互联的发展,移动手机端应用成爆发式的增长,在很多移动手机端中都涉及到对名片信息的录入,如移动手机CRM.移动手机端OA,移动手机访客系统等:如 ...

  9. 智能驾驶 车牌检测和识别(五)《C++实现车牌检测和识别(可实时车牌识别)》

    智能驾驶 车牌检测和识别(五)<C++实现车牌检测和识别(可实时车牌识别)> 目录 智能驾驶 车牌检测和识别(五)<C++实现车牌检测和识别(可实时车牌识别)> 1. 前言 2 ...

最新文章

  1. python和idl_有前辈对比过IDL和Python的速度吗,哪个会快点?
  2. 阐述一下Mysql事务的四个特性_数据库事务的四个基本性质?
  3. matlab神经网络工具箱创建神经网络,matlab神经网络工具箱创建神经网络
  4. datatable.select()的一个问题
  5. 中断程序_91工控ABB机器人中断程序(陷阱程序)TRAP
  6. sqlserver数据库中char、varchar、text与nchar、nvarchar、ntext数据类型使用详解
  7. 死循环线程php,QObject的派生类方法实现多线程死循环问题
  8. 拼多多否认损失 200 亿;董明珠回应再拼三年;特斯拉称“未来艰难” | 极客头条...
  9. Sitemesh3使用及配置
  10. 学术会议html模板,标准的学术会议的通知模板
  11. WIN7 IE10降级为IE9
  12. div实现上下左右居中的方法
  13. 革文B2B行业洞察:增长/存亡,中国医疗加速器第三方维保市场迷局
  14. html二级菜单点击淡入淡出,Web前端开发实战1:二级下拉式菜单之CSS实现
  15. Autoit+selenium+python实现文件上传功能
  16. win11设置开机自动打开chrome并最大化页面
  17. 修改ubuntu桌面分辨率方法
  18. 记录使用element-ui中el-upload的坑
  19. CDA数据分析师认证考试模拟题库
  20. 倪光南院士:构建安全可控的信息技术体系,云宏高安全的云计算关键核心技术先行

热门文章

  1. Unity3D 罗技G29开发笔记
  2. 我的500行代码 VS 资深大佬的50行代码
  3. html如何查看json数据,浏览器如何查看json格式的数据?查看方法分享
  4. 关于Flask框架中启动Scrapy爬虫框架时的几种问题的解决
  5. uptown funk 火星哥霸占BILLBOARD排行榜8周的嗨爆神曲
  6. 塔罗牌怎么引流?如何利用塔罗牌引流?做塔罗牌如何引流?
  7. 用Intellij IDEA 创建第一个Spring MVC项目
  8. 激光雷达(LDS)技术原理解释及实现过程
  9. 突发!活力花借款人被扫黑办传唤取证,与京东数科合作紧密
  10. 短裙高跟丝袜外拍,真的很漂亮哦!