OCR实时扫描识别中英文--tess_two在Android的使用
本篇博客是有了实时扫描识别的需求,然后看到了一篇博客,在其基础上按项目需求改进而成。感谢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的使用相关推荐
- UniAPP离线车牌实时扫描识别
插件说明 Android离线车牌实时扫描识别 标签:车牌实时识别 车牌离线识别 车牌实时扫描 车牌离线扫描 车牌实时离线识别 车牌实时离线扫描 特点: 1.使用方便,引入即可: 2.响应快速,原生体验 ...
- OCR扫描识别录入之安卓Android行驶证驾驶证识别SDK
现如今车辆走入了千家万户,已成为居民生活的必需品,而查驾照违章记录.缴纳违章罚款,也已经成了人们的生活常态了.而移动互联的发展,让这些以前需要跑银行.跑交警大队的事项,如今通过手机端就能解决了.但是手 ...
- [表格扫描OCR]快速扫描识别并获取表格图片内容[免费]
我们常常会拿到一些别人拍照发给我们的表格.也许一开始我们仅仅是想知道表格里面的内容就可以了,但当我们拿到表格以后可能我们就会有更高的要求了,我们也许想把这个表格也打印出来.但又不想打印那个歪歪扭扭的表 ...
- Android名片扫描识别系统SDK
Android名片扫描识别系统SDK 一.Android名片扫描识别系统应用背景 这些年,随着移动互联的发展,APP应用成爆发式的增长,在很多APP中都涉及到对名片信息的录入,如移动CRM.移动端OA ...
- android 名片识别 简书,名片扫描识别API
关键词:名片识别 移动端名片识别 云端名片识别 服务器端名片识别 名片识别SDK 名片识别api 一.名片识别背景 随着计算机技术的迅猛发展,电子化的名片变得越来越流行, 交换变得越来越方便.利用手机 ...
- OCR--苹果ios安卓android身份证拍照扫描识别sdk
一.ios安卓android身份证拍照扫描识别sdk应用背景 这些年,随着移动互联网的的发展,越来越多的企业都推出了自己的移动APP,这些APP多数都涉及到个人身份证信息的输入认证(即实名认证),如果 ...
- 智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》
智能驾驶 车牌检测和识别(四)<Android实现车牌检测和识别(可实时车牌识别)> 目录 智能驾驶 车牌检测和识别(四)<Android实现车牌检测和识别(可实时车牌识别)> ...
- 移动手机端名片扫描识别技术
一.移动手机端名片扫描识别技术应用背景 如今,随着移动手机互联的发展,移动手机端应用成爆发式的增长,在很多移动手机端中都涉及到对名片信息的录入,如移动手机CRM.移动手机端OA,移动手机访客系统等:如 ...
- 智能驾驶 车牌检测和识别(五)《C++实现车牌检测和识别(可实时车牌识别)》
智能驾驶 车牌检测和识别(五)<C++实现车牌检测和识别(可实时车牌识别)> 目录 智能驾驶 车牌检测和识别(五)<C++实现车牌检测和识别(可实时车牌识别)> 1. 前言 2 ...
最新文章
- python和idl_有前辈对比过IDL和Python的速度吗,哪个会快点?
- 阐述一下Mysql事务的四个特性_数据库事务的四个基本性质?
- matlab神经网络工具箱创建神经网络,matlab神经网络工具箱创建神经网络
- datatable.select()的一个问题
- 中断程序_91工控ABB机器人中断程序(陷阱程序)TRAP
- sqlserver数据库中char、varchar、text与nchar、nvarchar、ntext数据类型使用详解
- 死循环线程php,QObject的派生类方法实现多线程死循环问题
- 拼多多否认损失 200 亿;董明珠回应再拼三年;特斯拉称“未来艰难” | 极客头条...
- Sitemesh3使用及配置
- 学术会议html模板,标准的学术会议的通知模板
- WIN7 IE10降级为IE9
- div实现上下左右居中的方法
- 革文B2B行业洞察:增长/存亡,中国医疗加速器第三方维保市场迷局
- html二级菜单点击淡入淡出,Web前端开发实战1:二级下拉式菜单之CSS实现
- Autoit+selenium+python实现文件上传功能
- win11设置开机自动打开chrome并最大化页面
- 修改ubuntu桌面分辨率方法
- 记录使用element-ui中el-upload的坑
- CDA数据分析师认证考试模拟题库
- 倪光南院士:构建安全可控的信息技术体系,云宏高安全的云计算关键核心技术先行