5

Android 实现 Ocr手机号扫描

 3 years ago
source link: http://www.androidchina.net/9051.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

之前做手机号扫描,更换了很多方案,过程中的笔记都在这篇文章里,有兴趣可以看看
Ocr使用流程:http://blog.csdn.net/mr_sk/article/details/72877492

这里把算法整理了一下,封装了一个library(含Demo),地址:https://github.com/SiKang123/ImgTranslator

如果需要自己更改算法,可以直接改这个demo :https://github.com/SiKang123/ocrTest

这个算法主要针对下图中这种独立存在的一串手机号的识别,如果是 ” 手机号:13651761352 “
这种字符串,会直接被过滤算法过滤掉,因为在捕捉字符的过程中,会捕捉到至少14位字符,不符合手机号的11位特征,这种过滤条件,可以在Demo中自行调整


Demo截图:

这里写图片描述

这里写图片描述

图三
这里写图片描述

图四
这里写图片描述

这里写图片描述


图一:是扫描线没有对准手机号码,未捕捉到手机号的状态,这种状态下,每一帧都会在10-30ms之内被确定扫描线没有对准一个> 手机号而被过滤掉,不交给tess-two解析,直接放弃这一帧数据

图二:是扫描线对准了手机号,经过过滤算法后,捕捉到一个包含11位字符的蚊子块,基本确认存在手机号

图三:是 图二 状态下的识别结果

图四:是被水印干扰的手机号所得到的二值化图片

图五:是清除水印后取到的手机号区域(只适用于图五这种文字底部的干扰)

在project 的build.gradle中添加

allprojects {
      repositories {
    ...
    maven { url 'https://jitpack.io' }
      }
    }

在module的build.gradle中添加

dependencies {
    compile 'com.github.SiKang123:ImgTranslator:lastVersion'
}

在Application中初始化

ImageTranslator.getInstance().init(ApplicationContext);

传入需要识别的图片

Bitmap bmp=需要识别的图片,在扫描识别的场景中,就是相机预览图中取出的扫描区域;
    Translator translator = new PhoneNumberTranslator();
    //开始识别
    ImageTranslator.getInstance().translate(translator, rotateToDegrees(bmp, 90), new ImageTranslator.TesseractCallback() {
      @Override
      public void onResult(String result) {
    Log.d("scantest", "扫描结果:  " + result);
      }
      @Override
      public void onFail(String reason) {
    Log.d("scantest", "解析失败:  " + reason);
      }
    });

这种方法还可以针对 身份证扫描、邮箱扫描、银行卡号 等做相应的识别算法,如果有感兴趣的朋友愿意分享自己的算法,非常欢迎提交代码,提交代码格式如下:

以手机号识别为例,我创建了一个PhoneNumberTranslator类 假如你想实现一个邮箱扫描:

1、实现一个算法类,继承Translator,实现如下三个抽象方法

public class EmailTranslator extends Translator{
/**
* 你使用的字库名字
*/
@Override
public String initLanguage() {
    return "email";
}

/**
* @params 从相机预览图中传入的 扫描区域Bitmap
* 在这里实现你对图片中的email的过滤、捕捉等处理,然后返回捕捉到的email区域bitmap
* 如果可以断定图片中没有email,return null即可
*/
@Override
public Bitmap catchText(Bitmap bitmap) {
    return emailBitmap;
}

 /**
* 对于扫描结果的筛选
* 如果catchText() 捕捉到了email,那么这个包含email的Bitmap会交由 tess-two识别,最终的识别结果,会用正则公式来筛选需要的内容
* 比如这里返回了一个email的正则表达式,最终会将识别结果中的所有email返回,如果不需要筛选,这里return "" 即可
*/
@Override
public String filterRule() {
    return "^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$";
}
}

2、提交你的字库

将你使用的字库文件提交到 https://github.com/SiKang123/tessdata ,比如这里用的是email字库,那么就将email.traineddata 文件,提交到这个地址

3、提交你的代码,我测试后,上线代码


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK