Android 实现 Ocr手机号扫描

之前做手机号扫描,更换了很多方案,过程中的笔记都在这篇文章里,有兴趣可以看看
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、提交你的代码,我测试后,上线代码

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
要在Android Studio中实现OCR(光学字符识别),你可以使用Google提供的Firebase ML Kit。Firebase ML Kit是一个强大的移动机器学习工具包,其中包含了OCR功能。 以下是实现OCR的步骤: 1. 在Android Studio中创建一个新的Android项目。 2. 在项目级别的build.gradle文件中添加Firebase ML Kit的依赖。例如: ``` dependencies { // ... implementation 'com.google.firebase:firebase-ml-vision:24.0.3' } ``` 3. 在Firebase控制台中创建一个新的项目,并启用ML Kit API。 4. 在Firebase控制台中下载并添加google-services.json文件到你的Android项目的app目录中。 5. 在你的Android项目的build.gradle文件中添加Google服务插件。例如: ``` apply plugin: 'com.google.gms.google-services' ``` 6. 在你的Activity中初始化Firebase ML Kit。例如,在onCreate方法中添加以下代码: ```java FirebaseApp.initializeApp(this); ``` 7. 创建一个Bitmap对象,该对象包含你想要进行OCR的图像。 8. 使用Firebase ML Kit的TextRecognizer类进行OCR。例如: ```java TextRecognizer textRecognizer = FirebaseVision.getInstance() .getOnDeviceTextRecognizer(); FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap); textRecognizer.processImage(image) .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() { @Override public void onSuccess(FirebaseVisionText result) { // 处理识别结果 // result对象包含了识别到的文本信息 } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // 处理识别失败的情况 } }); ``` 9. 在成功回调中处理OCR的结果。你可以通过result对象获取识别到的文本信息。 这是一个简单的实现OCR的步骤。你可以根据你的具体需求和UI设计进行更多的定制和优化。记得在使用Firebase ML Kit时,遵循相关的使用条款和隐私政策。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值