本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发。
公司业务需求,需要做手机号码的识别。所以有了此篇文章,现在就将实现过程分享给大家。

1.准备工作

  • 首先实现识别数字等字符,我们要知道需要采用OCR (Optical Character Recognition,光学字符识别)来实现。而tesseract是非常不错的开源OCR工具,但是要在Android中直接使用可能要费点功夫。不过不用担心,tess-two拯救了我们。

  • 其次是扫一扫识别,那么很快联想到的就是常见的二维码扫描这类的项目。通过扫一扫实时拿到图像,来做识别。

  • 接下来在Github上找到了QrCodeScanner项目,作者通过一定的优化,使得识别的效率有所提升。那么我们用它来扫描数字,也会有效率上的提升。

2.实现细节

1.首先是tess-two的用法。

app下的build.gradle的配置如下

android {defaultConfig {....ndk {abiFilters 'armeabi' //自行选择添加}}}dependencies {compile 'com.rmtheis:tess-two:8.0.0'
}

识别方法:

public String detectText(Bitmap bitmap) {TessBaseAPI tessBaseAPI = new TessBaseAPI();String path = ""; //训练数据路径tessBaseAPI.setDebug(true);tessBaseAPI.init(path, "eng"); //eng为识别语言tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); // 识别白名单tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, "!@#$%^&*()_+=-[]}{;:'\"\\|~`,./<>?"); // 识别黑名单tessBaseAPI.setPageSegMode(TessBaseAPI.PageSegMode.PSM_AUTO_OSD);//设置识别模式tessBaseAPI.setImage(bitmap); //设置需要识别图片的bitmapString inspection = tessBaseAPI.getHOCRText(0);tessBaseAPI.end();return inspection ;}

训练数据可以在tessdata下载,里面包含各种语言。当然你自己也可以训练它,有兴趣的可以学习一下相关内容。

2.从tess-two的用法可以知道,我们最终需要的是识别图片的Bitmap。在扫码项目中我们找到在DecodeHandler类的decode方法中,我们会得到一个PlanarYUVLuminanceSource类的实例。在使用HybridBinarizer算法解析数据源,最终采用MultiFormatReader解析图像出结果。代码大致如下:

    Result rawResult = null;MultiFormatReader mMultiFormatReade = new MultiFormatReader();try {PlanarYUVLuminanceSource source =new PlanarYUVLuminanceSource(```, false);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));rawResult = mMultiFormatReader.decode(bitmap, mHints);} catch (ReaderException ignored) {} finally {mMultiFormatReader.reset();}

看完后懵逼了,没有Bitmap。经过一番查找,找到了在旧版的zxing中PlanarYUVLuminanceSource类有renderCroppedGreyscaleBitmap方法,不知为何去除了。。。

3.之后修改了一些相机的参数信息,适配了部分设备的预览效果。基本的页面修改了一下。这里就不赘述了。

走一波,如下效果:

可以发现除了数字以外,它将中文识别为了字母。其实问题首先是我们使用了英文的训练数据,同时白名单设置了a~z的字母。当然你也不能将字母设置为黑名单,那样只会让识别不出的字符识别为乱七八糟的数字。

这里我给出的建议是利用正则去筛选,这样你可以识别你想要的各种格式数据。我这里只是做了手机号的简单识别,大家可以举一反三去处理。

    public static String getTelNum(String sParam){if(TextUtils.isEmpty(sParam)){return "";}Pattern pattern = Pattern.compile("(1|861)(3|5|7|8)\\d{9}$*");Matcher matcher = pattern.matcher(sParam);StringBuilder bf = new StringBuilder();while (matcher.find()) {bf.append(matcher.group()).append(",");}int len = bf.length();if (len > 0) {bf.deleteCharAt(len - 1);}return bf.toString();}

修改后如下:(同时支持多个号码)

当然本项目也保留了扫码功能(可在DecodeHandler中自己添加条码格式):

细心的同学可以从图中看到扫描框的大小都不一样,这里我是改成了可以手动调节大小的扫描框。毕竟扫码模式下,框大一点还是比较好识别(将二维码放入框中有时就费时间)。扫数字这些文字时,框小一点会好识别。具体可以下载自行体验。

最后我将代码已经上传至Github:Tesseract-OCR-Scanner,大家多点赞点星,感谢!!

3.参考

  • 安卓OCR之数字英文扫描识别

  • Android Character Recognition

  • zxing扫描二维码和识别图片二维码及其优化策略

安卓实现扫一扫识别数字相关推荐

  1. Android实现扫一扫识别图像数字(使用训练的库拍照查看扫描结果)(下)

    Android实现扫一扫识别图像数字(使用训练的库拍照查看扫描结果)(下) 关于 效果图 第一步,添加我们的训练库 编写扫描框控件 新建扫码界面ScannerActivity.java 关于二维码拍照 ...

  2. Android实现扫一扫识别图像数字(镂空图像数字Tesseract训练)(上)

    Android实现扫一扫识别图像数字(镂空图像数字训练)(上) 关于 需要的工具以及安装运行步骤如下 1.安装tesseract 2.下载使用jTessBoxEditor与素材准备 3.开始操作 步骤 ...

  3. 名片识别扫一扫,如此实现的

    名片识别"扫一扫"是如何实现的,优点主要表现为: 名片扫一扫识别SDK通过调用识别功能Activity,实现APP应用程序接口调用,支持JAVA.Object-C等多种语言开发调用 ...

  4. 名片扫一扫识别OCR技术

    出去见客户,交朋友,我们都会交换名片,一般情况下送出去多少名片,就会收到多少名片.我们都会拿一个整理名片的盒子,甚至专门用一个抽屉来整理我们收集起来的名片,有时候突然想起一位朋友,但想从名片堆里查找出 ...

  5. 【微信小程序系列:二】小程序常用功能:跳转地图、扫一扫、人脸识别、拍照、拨打电话、调整屏幕亮度、文字可复制、监听截屏...

    一.先言: (- ̄▽ ̄)-,hello,微信小程序系列第二篇,介绍下小程序里的前端常用功能api,可以快速copy使用~ 二.文字可复制: 小程序页面里的文字默认是没有长按复制功能的,需要套个标签来实 ...

  6. 植物识别扫一扫的软件有哪些?植物识别软件推荐。

    植物识别扫一扫的软件有哪些?相信非常多的小伙伴,日常出门在外的时候,经常会碰到一些不认识的花花草草,出于我们的好奇心,我们通常都非常想知道不认识的这些花花草草,究竟叫什么,那么这时候我们就需要借助软件 ...

  7. 一文看尽微信AI团队打造扫一扫植物识别利器

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 本文转载自:微信AI 导语 冬去春来日渐暖,柳絮萌芽草生根.立春已过,又到了户外踏青赏花的季节.再过段时间, ...

  8. Android扫车牌号识别技术SDK

    Android扫车牌号识别技术SDK Android扫车牌号识别技术SDK描述 Android扫车牌号识别技术SDK是我公司开发的基于移动平台的车牌识别软件开发包,支持android.iOS等多种主流 ...

  9. hbilderx 扫一扫_【报Bug】hbuilder 扫一扫从相册中选图的图片扫码识别不出来

    详细问题描述 (DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题) [内容] 调用扫一扫,从相册 ...

最新文章

  1. 简单介绍python3判断IP地址的方法
  2. 静态库调用中“unrecognized selector sent to instance”错误
  3. git查看相对于最新的push改动内容
  4. Career Service, what skills do you need for career domain?
  5. 冒泡排序python代码_Python-排序-冒泡排序-优化
  6. C/C++中宏使用总结
  7. ob 接oracle10时接不上怎么办?
  8. 华为手机怎么隐藏按键图标_mac桌面图标怎么快速隐藏?
  9. C语言高级输出及进阶
  10. go 输入输出流(fmt)
  11. SVN安装-配置-使用及myeclipse的插件安装(图文)
  12. fastdfs+nginx make时报错fatal error:fdfs_define.h: 没有那个文件或目录
  13. java毕业设计宿舍管理系统mybatis+源码+调试部署+系统+数据库+lw
  14. Delphi修改FMX Label字体颜色
  15. 谈谈项目成本管理遇到的难题及解决措施
  16. 牛客练习赛28 E【斜抛运动的最大水平射程】
  17. 万字实录:从DDCTF大赛看当前网络安全新趋势 | 硬创公开课总结文+视频(上篇)...
  18. 软考中级 真题 2014年下半年 系统集成项目管理工程师 基础知识 上午试卷
  19. 100个 ChatGPT 提示(Prompt)优化高质量提问案例
  20. 中国的美女为什么这样少的原因

热门文章

  1. 利用tushare pro根据财务指标选股
  2. 记录人生第一次收获offer的艰辛
  3. 【环信IM集成指南】iOS端常见问题整理(2)
  4. 2021-2027全球与中国厨房用食品搅拌机市场现状及未来发展趋势
  5. java代码校验手机号码_校验手机号码的正则表达式写法 (java实现)
  6. Android 毛小软件,安卓薅羊毛软件
  7. XGBoost:参数解释
  8. 思科网络安全 第五章测验答案
  9. linux运维前景2018,Linux运维工程师为什么越来越受企业重视?
  10. 提高工作效率--番茄工作法