Android 實現 Ocr手機號掃描
之前做手機號掃描,更換了很多方案,過程中的筆記都在這篇文章裡,有興趣可以看看
Ocr使用流程:ofollow,noindex">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、提交你的程式碼,我測試後,上線程式碼