安卓OCR之數字英文掃描識別
項目有個需求,有關證明的編號錄入比較繁瑣。基於支付寶可以掃描識別銀行卡號,我覺得通過掃描並識別可以達到這一需求,以下文(dan)章(teng)即來源於此。
無一例外的,需要圖片識別就必須用到OCR引擎,還必須是開源的(逃...那目標就很明確了,google/百度之,發現谷歌大廠有一個Tesseract項目(基於C++),興奮之余遂繼續尋找其android分支,好在終於找到了tesstwo。開始干活0
...
...
...
其實並沒有,機緣巧合下我在網上找到一個很有用的demo(需要翻牆),它的效果是這樣的:
。
於是,我下載其源碼,試圖在本地重現一下。但悲劇的是,這個demo是基於gradle構建的,雖然我試遍了IDEA和Android Studio,還是不行,遂作罷。
回到最初,將tesstwo源碼編譯出.so文件才是當務之急。在試過這篇博客中的方法后,不行...繼續尋覓,終於我在安裝了NDK的Android Studio中編譯成功,編譯好的庫文件有多個,取armeabi目錄中的全部so文件。
接下來,在Eclipse里新建項目(原諒我實在不會gradle),使用上述demo的代碼,並引入編譯好的so文件(記得帶着armeabi目錄),除除錯,再運行一下~好了,終於看到了gif中的效果。
到這里算是實現了一大步/一小步,但這個demo不是掃描自動識別的,我們需要類似於二維碼掃描識別的效果。自然而然的,我想到了zxing(又是谷歌大廠的)。
類似於這種掃描+識別的功能,我覺得應該是這樣一個流程
對焦→拍照→裁剪→有效部分→調用算法識別→成功/失敗→返回結果/繼續對焦
扒出項目中zxing的源碼看了一遍,印證了我的猜想。那么問題就很簡單了,我們只需要改動裁剪和調用的算法就能達到目的了。
裁剪這部分在zxing/camera/CameraManager.java中的getFramingRect()方法中,設定其寬高即可(其實就是取景框的寬高)。
至於修改調用的算法則是在DecodeHandler.java中的decode()方法中,在此方法中我們會得到一個PlanarYUVLuminanceSource類的實例,調用該實例的renderCroppedGreyscaleBitmap()方法就會返回相應的BitMap對象,有了該對象之后,我們就可以使用tesstwo的API(或者上述demo對tesstwo的API的封裝tessEngine)得到識別后的結果。如果結果與我們的預期符合(我傳入一個正則表達式來實現),就可以將結果返回了。結果返回的過程以及接受結果的方法handleDecode()也需要一些處理,在此不再贅述。
插一句題外話,現在很多工具都是需要linux/unix環境支持,雖然在windows中有相應的工具模擬,但不是不方便就是坑比較多,總歸不好使。不過現在win10有個自帶的ubuntu子系統,大家可以試試~~
