关闭

安卓实现扫一扫识别数字

标签: androidtesseractqrcode
7650人阅读 评论(30) 收藏 举报
分类:

公司业务需求,需要做手机号码的识别。所以有了此篇文章,现在就将实现过程分享给大家。

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); //设置需要识别图片的bitmap
        String 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.参考

20
1
查看评论

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

遇到一个需求,要用手机扫描纸质面单,获取面单上的手机号,最后决定用tesseract这个开源OCR库,移植到Android平台是tess-two Android平台tess-two地址:https://github.com/tesseract-ocr 我把手机号扫描的算法封装了一下,Demo地址...
  • Mr_Sk
  • Mr_Sk
  • 2017-06-06 13:57
  • 5998

Android Tesseract识别数字

最近接触到Tesseract,有个感触就是人与人之间的差距可能就在 Google和Baibu 之间 好了,话不多说,关于Tesseract背景什么的我不介绍了 入正题: step1:  首先去http://code.google.com/p/tesseract-ocr/do...
  • zhuxu820_
  • zhuxu820_
  • 2015-04-25 12:25
  • 2922

自己动手实现Android平台手写体数字识别之识别算法准备

上一篇博文里已经将MNIST的训练集和测试集都归一化成了20x20的图像,现在就可以选择一个合适的算法做识别了。 我这里并没有用很牛逼的算法(本身就是非专业的,自然也想不到啥牛逼算法),都是按照书上讲的从13特征点,Fisher分类开始做,然后引入了书上讲的比较多的BP神经网络,再后来结合了PCA去...
  • chenxupro
  • chenxupro
  • 2013-10-07 11:01
  • 2946

数字识别软件Ocr,非常棒

  • 2008-11-03 21:06
  • 70KB
  • 下载

opencv 数字识别详细教程

最近要做数字识别这块,但是自己又完全不懂这个,网上搜资料搜了好多,但是都没找到完整代码。只有自己慢慢搞,下面写下自己的过程以及代码有不好的地方希望大神可以指出,大家相互交流下。有需要完整代码的可以留下邮箱 我是在VS2013 和opencv 2.4.9 环境下实现的。关于环境的搭建和配置以及软件的下...
  • LTG01
  • LTG01
  • 2016-01-10 16:11
  • 18752

OpenCV手写数字字符识别(基于k近邻算法)

摘要 本程序主要参照论文,《基于OpenCV的脱机手写字符识别技术》实现了,对于手写阿拉伯数字的识别工作。识别工作分为三大步骤:预处理,特征提取,分类识别。预处理过程主要找到图像的ROI部分子图像并进行大小的归一化处理,特征提取将图像转化为特征向量,分类识别采用k-近邻分类方法进行分类处理,最后根据...
  • wangyaninglm
  • wangyaninglm
  • 2013-12-03 10:32
  • 27228

【opencv】神经网络识别数字

文本直接仅对0-9这十个文件夹中sample_mun_perclass个样本进行训练,直接通过API函数FindFirstFile和FindNextFile得到目录下文件,不需要对图片名编号用了一下午时间去调这个代码,所以还有很多不完善的地方,以后有时间再去完善,比如: 本文的测试图片仅仅是单张测...
  • qq_15947787
  • qq_15947787
  • 2016-05-12 17:23
  • 8645

手把手入门神经网络系列(2)_74行代码实现手写数字识别

作者: 龙心尘&&寒小阳 时间:2015年12月。 出处: http://blog.csdn.net/longxinchen_ml/article/details/50281247 声明:版权所有,转载请联系作者并注明出处,谢谢。1、 引言:不要站在岸上学游泳“机器学习...
  • yaoqiang2011
  • yaoqiang2011
  • 2015-12-13 12:36
  • 39309

Python(TensorFlow框架)实现手写数字识别系统

本文使用Tensorflow框架进行Python编程实现基于卷积神经网络的手写数字识别算法,并将其封装在一个GUI界面中,最终,设计并实现了一个手写数字识别系统。
  • louishao
  • louishao
  • 2017-03-08 09:57
  • 7949

[机器学习]基于OpenCV实现最简单的数字识别

http://blog.csdn.net/jinzhuojun/article/details/8579416 本文将基于OpenCV实现简单的数字识别。这里以游戏Angry Birds为例,通过以下几个主要步骤对其中右上角的分数部分进行自动识别。 1. 学习分类器 根据训练样本,...
  • wanglang3081
  • wanglang3081
  • 2013-11-22 15:20
  • 42846
    个人资料
    • 访问:216017次
    • 积分:3254
    • 等级:
    • 排名:第12367名
    • 原创:70篇
    • 转载:10篇
    • 译文:0篇
    • 评论:228条
    多多支持
    博客专栏
    最新评论