由于工作需要,需要对快递单上的手机号码进行快速扫描识别。查询各种OCR识别方式后还是决定采用Android+Tesseract进行识别。

今天开始记录开发过程。首先是开发环境的配置。

我的Android Studio 版本是最新的4.0。

1:环境搭建,新建项目,采用JAVA编程。

项目建成后开始部署OCR识别包。

首先需要下载OCR识别包。但由于该识别包内包含了英文所以对于识别数字来说有点厚重冗余。所以在在网上搜索后得到了一个只包含数字的OCR识别包。资源会上传到资源中。

在APP目录下新建资源包assets 右键在项目下选择NEW 在选择Folder然后选择Assets Folder .将OCR识别文件复制到该资源目录下。存放到该目录下的原因是需要将OCR识别包拷贝到手机的SD卡下。 方便以后进行OCR识别。

OCR识别包部署完成。

2:开始配置OCR的导入。

在配置文件builder.gradle中导入google的识别包。

我使用的是9.1目前是最新版。可以根据需要来下载最新版本。 识别包导入后可以进行正常开发了。

二 开始布局开发及基本的自定义相机应用。

1:在布局之前 先在配置文件 AndroidManifest.xml  中申请 权限。

SD卡的读写权限。

相机的使用权限。

其他权限可以根据应用的情况来进行申请。

判断并申请权限。

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.widget.Toast;import androidx.core.app.ActivityCompat;public class permission {//申请权限public void permission(Context context, Activity activity) {//判断权限。如果没有SD卡的写权限,没有相机的权限则开始申请权限。if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {//没有权限开始进行申请。if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) &&ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) {//开始提示信息Toast.makeText(context, "请先申请权限再进行操作。", Toast.LENGTH_SHORT).show();} else {ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE},1);}}}
}

权限申请后开始在主程序中调用该方法进行权限申请。

开始自定义相机开发。

这里 只说相机开发的注意点,以及相机的蒙版开发过程中遇到的坑和解决办法。

1:相机开发。

我这里用的是 android.hardware.Camera 进行的自定义相机的开发。这种架构以及属于淘汰阶段。但也可以正常使用。

相机在预览过程中如果需要得到Bitmap 的话 一定要先进行数据流的转换因为Camera默认的格式是YuvImage格式所以需要在重写预览的事件。也就是   camera.setPreviewCallback(new Camera.PreviewCallback()) 重写这个事件。在此事件中有data参数。该参数是相机预览中的数据流。通过转换可以得到Bitmap从而可以进行图片的裁剪。

2:相机的蒙版 。

相机蒙版开发中由于资料较少 ,所以研究了比较长的时间 。在这里记录一下 可以让后来的人或者自己以后少走弯路。

新建java class 继承 view .

蒙版的建立其实就是 画笔的定义。也就是 层 。

在画布Canvas 固定的情况下  我们可以定义不同的Paint 来进行绘画。从而可以达到蒙版的效果。

首先定义第一个Paint .这个用来绘画蒙版的底层。在这一层中 一定要采用混合图像模式。这样才会形成中间亮四周黑的效果。

也就是:

//设置 抗锯齿
paint.setAntiAlias(true);
//设置 抖动
paint.setDither(true);
//设置混合图像为清除模式。
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

在这里采用清除模式 可以将制定的区域进行清除。

最为重要的是如果想得到这个效果 一定要重写 Canvas的onDraw事件。

定义第二个paint 重要是用来绘制边框。

定义第三个paint 可以用来绘制四角的短线。最终效果如下:

这样也就形成了最终的蒙版。

数字识别

在UI设计完成并可以对生成的Bitmap进行裁剪后 我们可以调用OCR来进行图片的识别。

由于是实时进行图片的识别 。所以最好重新建立一个线程 。在单独的线程中进行操作。

这样就可以实时进行图片的识别 。

//将识别文件拷贝到SD卡中。目前我这里是不管文件在不在都进行拷贝。
private void ocrfilecopy() {//在SD卡中创建存放识别库的目录。该目录名必须是tessdata 这个文件名是在API使用中规定了的。//定义tessdata目录在SD 卡的路径。String Chisim_dir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tessdata";//定义识别文件的绝对路径和文件名。chi_sim.traineddata 识别文件名。String orc_filename = Chisim_dir + "/chi_sim.traineddata";Log.i("path", Chisim_dir);//检查是否存在此目录。如果存在则不创建,否则则创建目录。File dirfile = new File(Chisim_dir);if (dirfile.exists() == false) {//目录不存在。则创建。dirfile.mkdir();Log.i("提示信息", "目录已创建。");}//目录创建完成后将OCR识别文件CHI_SIM拷贝到该目录下。//判断识别文件Chi_sim.traineddata是否存在。File ocrfile = new File(orc_filename);//不管识别文件是否存在先删除在创建。ocrfile.delete();//开始创建文件。//首先文件是存放在资源文件夹assets下的。所以要先获取资源;AssetManager assetManager;assetManager = getAssets();//开始读取识别文件并开始复制。输入。InputStream inputStream;//开始写入文件。输出。OutputStream outputStream;try {//将识别文件读入到输入流中。inputStream = assetManager.open("chi_sim.traineddata");//创建目标文件。outputStream = new FileOutputStream(orc_filename);//开始复制,每次复制1024k的字节。byte[] buff = new byte[1024];//开始循环写入。int ll_count;while ((ll_count = inputStream.read(buff)) != -1) {outputStream.write(buff, 0, ll_count);}//释放资源outputStream.flush();outputStream.close();inputStream.close();} catch (IOException e) {e.printStackTrace();}
}//开始识别图片中的数字。
private String disocrnumber(Bitmap bitmap) {String number = null;//定义使用的字符集。String orctype = "chi_sim";//实例化  ocr  APITessBaseAPI tessbaseapi = new TessBaseAPI();//开始初始化 指定识别所用的资源位置。在SD卡中的位置。tessbaseapi.init(Environment.getExternalStorageDirectory().getAbsolutePath(), orctype);//初始化后开始识别图片。设置需要识别的图片。tessbaseapi.setImage(bitmap);//得到识别内容number = tessbaseapi.getUTF8Text();Log.i("fasdasdfsdafasd", "number=" + number);return number;
}

Android OCR数字识别相关推荐

  1. Android OCR文字识别 实时扫描手机号(极速扫描单行文本方案)

    更新: AI时代已经到了,各位小伙伴如果还有类似的需求,现在已经有很成熟的免费OCR库了,不用再挖古董文章了,钻研精神要保持,但也不用处处自己造轮子了哦 要做实时OCR扫描的可以参考 Google M ...

  2. Android Ocr文字识别 身份证识别 实时扫描

    遇到一个需求需要扫描身份证,识别身份证号并进行查询,在网上百度需要用到文字识别技术,ocr tess-two,看到网上有关于中英文实时扫描和手机号实时扫描的功能,于是在这两者的基础上进行了改进,感谢顾 ...

  3. android ocr 身份证识别

    ocr opencv 想必做过程图像识别的同学们都对这两个词不陌生吧. ocr (optical character recognition ,光学字符识别) 是指电子设备(例如扫描仪或数码相机)检查 ...

  4. android led数字识别,opencv 学习之 液晶数字识别

    算法采用纵向及横向扫描方式,对清晰图片进行了实验,效果较好. 算法未检测小数点,感兴趣的同学可以Y方向腐蚀检测小数点,按照X坐标排序即可. 当然,数字及字符识别,SVM.K近邻.神经网络等等这些才是正 ...

  5. java ocr数字识别_Java OCR tesseract 图像智能文字字符识别技术实例代码

    接着上一篇OCR所说的,上一篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码实现的,下面给大家分享下Java实现的例子. 拿代码扫描上面的图片,然后输出结 ...

  6. opencv +数字识别

    现在很多场景需要使用的数字识别,比如银行卡识别,以及车牌识别等,在AI领域有很多图像识别算法,大多是居于opencv 或者谷歌开源的tesseract 识别. 由于公司业务需要,需要开发一个客户端程序 ...

  7. c# opencv车牌识别_opencv +数字识别

    现在很多场景需要使用的数字识别,比如银行卡识别,以及车牌识别等,在AI领域有很多图像识别算法,大多是居于opencv 或者谷歌开源的tesseract 识别. 由于公司业务需要,需要开发一个客户端程序 ...

  8. android tensorflow文字识别身份证识别ocr文字识别商用源码

    一 ,文字识别简介 计算机文字识别,俗称光学字符识别,英文全称是Optical Character Recognition(简称OCR),它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并 ...

  9. OpenCV实现0到9数字识别OCR

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 使用OpenCV对0到9数字进行识别,实现简单OCR功能,基于CA ...

  10. 将tensorflow训练好的模型移植到Android (MNIST手写数字识别)

    将tensorflow训练好的模型移植到Android (MNIST手写数字识别) [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/det ...

最新文章

  1. linux ftp服务器搭建及用户的分配,Linux搭建FTP服务器
  2. Mac安装MySQL数据库
  3. 关于git提交的自己的理解
  4. element-ui使用导航栏跳转路由用法
  5. IPRO_DOCXCC_FILLIN_UUIDTONAME
  6. ubuntu按方向键出现abcd_Ubuntu Vi方向键[A [B [C [D问题解决
  7. Taro+react开发(8)--控制跳转
  8. 【Day09】JavaScript 为什么要区分微任务和宏任务
  9. pg订阅oracle修改,PostgreSQL修改数据库timezone
  10. mysql重复数据处理_MySQL 处理重复数据
  11. python从oracle提取数据库_Python编程实战之Oracle数据库操作示例
  12. 解决Eclipse中文乱码的问题
  13. [Xcode]XcodeGhost问题的检查和验证
  14. CWDM SFP彩光模块知识百科
  15. 王者荣耀登录显示换服务器是不是封号,王者荣耀这么查看封号原因?千万不要这么做!...
  16. 智能硬件开发如何选择低功耗MCU?
  17. WZOI-272友谊
  18. 流量卡之家:三大运营商停售达量限速套餐?联通移动称未接到通知
  19. python绘制散点图的步骤_python绘制散点图
  20. 毕设经典-人事档案管理系统(layer+SSM)-AOP介绍

热门文章

  1. ila、dbg_hub、jatg时钟关系
  2. 京东登录页面html代码_如何制作一个简单的HTML登录页面(附代码)
  3. OJ水题-----蛇形填数
  4. 关于消息队列的一些思考
  5. Ecshop3.x漏洞复现
  6. java 大转盘算法_幸运大转盘抽奖 抽奖算法 程序实现逻辑
  7. IC设计多时钟域处理
  8. 学会这个小技巧,SSH 会话连接永远不超时!
  9. 怎么把小米手机通讯录导入苹果手机
  10. mysql 5.1 变量专题