1. 程式人生 > >Android 實現 Ocr手機號掃描

Android 實現 Ocr手機號掃描

這個演算法主要針對下圖中這種獨立存在的一串手機號的識別,如果是 ” 手機號: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、提交你的程式碼,我測試後,上線程式碼