iOS中如何用OCR高效識別手機號

背景

最近項目中有個需求,就是讓識別手機號江醇。其實按照產(chǎn)品的思路就是外購濒憋,而且確實已經(jīng)開始采購。由于采購過程其實也是漫長的陶夜,于是乎本人就準(zhǔn)備自己研究一下實現(xiàn)手機號識別凛驮。

如果用一些第三方的話,比如百度OCR識別是有限制的条辟,而且就是集成SDK而已黔夭,沒什么可研究的宏胯。最終經(jīng)過尋尋覓覓,找到了我們今天的主角--Tesseract本姥。Tesseract是一款由HP實驗室開發(fā)由Google維護(hù)的開源OCR(Optical Character Recognition , 光學(xué)字符識別)引擎胳嘲。

引入Tesseract

工程引入過程真可謂是一波三折,在自己工程引入的時候遇到了挺多的問題扣草。

首先我們通過Github上的開源代碼下載Tesseract主工程了牛,在主工程中我們可以看到Tesseract會被單獨編譯成一個動態(tài)庫

引入項目

  • 將編譯好的TesseractOCR.framework導(dǎo)入到工程中
  • tessdata文件夾拖到自己的工程中
  • 測試demo
G8Tesseract *tesseract = [[G8Tesseract alloc] initWithLanguage:@"eng"];
tesseract.engineMode = G8OCREngineModeTesseractOnly;
tesseract.pageSegmentationMode = G8PageSegmentationModeAutoOSD;
tesseract.image = [UIImage imageNamed:@"image_sample.jpg"];;
[tesseract recognize];
NSString *recognizedText = tesseract.recognizedText;
NSLog(@"%@",recognizedText);

其實通過最簡單的三部我們已經(jīng)完成了TesseractOCR集成。是不是很簡單俺矫睢鹰祸?其實不然,通過以上簡單三步我們可能會遇到以下問題密浑。

問題1

dyld: Library not loaded: @rpath/TesseractOCR.framework/TesseractOCR
  Referenced from: /var/containers/Bundle/Application/.../testocr.app/testocr
  Reason: image not found

這個問題解決方案就是在Xcode->General->Embedded Binaries 點擊+,選擇TesseractOCR.framework即可解決

問題2

Error opening data file /var/containers/Bundle/Application/.../testocr.app/tessdata/chi_sim.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.

這個問題就是我在在引入tessdata文件夾的方式的時候?qū)е碌摹?br>

1564018584898.jpg

我們只要在導(dǎo)入的時候注意選擇Create folder references就可以了蛙婴。

通常通過以上步驟,此時我的demo能夠正常運行起來了尔破,而且能夠識別出原來工程中的圖片

高效識別手機號

我們項目中的需求就是通過視頻流截取一張圖片街图,然后再通過TesseractOCR識別。效果圖如下:

1564019370003.jpg

通過以上代碼集成到我們自己的工程發(fā)現(xiàn)一個問題就是手機號識別率很低懒构。因為我們用的是eng訓(xùn)練庫餐济,所以就考慮是不是水土不服,將他換成中文的訓(xùn)練庫胆剧。

說干就干我們就去官方下載最新的4.0.0中文訓(xùn)練庫chi_sim.traineddata絮姆。

  • 放到tessdata文件夾中
  • 更改代碼,將eng改成chi_sim
G8Tesseract *tesseract = [[G8Tesseract alloc] initWithLanguage:@"chi_sim"];

本以為會大功告成,反而這里就是重頭戲!

問題3

allow_blob_division

在chi_sim.traineddata文件目錄下,使用命令行執(zhí)行:

combine_tessdata -e chi_sim.traineddata chi_sim.config

執(zhí)行完后秩霍,在目錄下出現(xiàn)chi_sim.config的文件篙悯,打開該文件;
在allow_blob_division F這一行的前面加#铃绒,注釋掉

即:# allow_blob_division        F  

然后鸽照,在執(zhí)行命令行:
combine_tessdata -o chi_sim.traineddata chi_sim.config

到此在使用 chi_sim.traineddata文件就不會報read_params_file: parameter not found: allow_blob_division

問題4

actual_tessdata_num_entries_ <= TESSDATA_NUM_ENTRIES:Error:Assert failed:in file ../../ccutil/tessdatamanager.cpp, line 53

這個問題我集合Google和Github上的Issues得出統(tǒng)一結(jié)論:chi_sim.traineddata版本庫不對應(yīng),因為我們下載的是4.0.0最新版颠悬,所以按照結(jié)論我們就換成一個較低的版本矮燎,而且確實可以啦!

不過綜合對比下來感覺識別率還不是很好椿疗,畢竟最新的訓(xùn)練庫代表著識別率最高漏峰,所以心里隱隱還是不甘心糠悼。

通過問題3不知大家有沒有感覺到chi_sim.traineddata可以進(jìn)行分解届榄,然后再次合成呢?

通過結(jié)合combine_tessdata有關(guān)介紹此命令的文章倔喂,我有了一個大膽的想法铝条,將老版本和新版本的的chi_sim.traineddata分別解包靖苇。然后將兩個集合起來重新合成。

我們通過以下兩行即可實現(xiàn)

合成

combine_tessdata -o chi_sim.traineddata chi_sim.

解壓

combine_tessdata -e chi_sim.traineddata chi_sim.
  • 解壓班缰。首先我們通過命令分別解壓最新版和舊版的chi_sim.traineddata

通過解壓出來的文件贤壁,我們對比發(fā)現(xiàn)其實新版比舊版少了幾個文件。這時候我有個更大膽的想法埠忘,我只要我需求的文件脾拆,我只要數(shù)字識別庫就好了,通過這種方式可以極大的減少包的大小莹妒,不過通過嘗試以失敗告終名船。因為只要我們需要的庫的話,數(shù)量與代碼中的數(shù)量又不匹配了

  • 替換旨怠。將新版包里的文件全部復(fù)制到舊版中進(jìn)行替換
  • 合成渠驼。通過合成命名合成一個新的chi_sim.traineddata

將我們合成的chi_sim.traineddata放到工程中就不會再報問題4了。而且識別率很高鉴腻。(我自己合成的已經(jīng)分享出來了在文章末尾)

優(yōu)化識別率

結(jié)合上步合成的最新訓(xùn)練庫迷扇,通過多次嘗試,以下代碼是識別率最高的了爽哎。

G8Tesseract *tesseract = [[G8Tesseract alloc] initWithLanguage:@"chi_sim"];
tesseract.engineMode = G8OCREngineModeTesseractOnly;//必須要設(shè)置此模式
tesseract.pageSegmentationMode = G8PageSegmentationModeSparseText;//此模式識別率最高
 tesseract.charWhitelist = @"0123456789";//白名單
tesseract.charBlacklist = @"abcdefghigklmnopqrstuvwxyz-_";//黑名單
tesseract.image = newImage;
tesseract.rect = CGRectMake((KSCREEN_WIDTH-210-16)/2, 62-2, 210, 20+4);
tesseract.maximumRecognitionTime = 5;
[tesseract recognize];

是不斷的使用中蜓席,發(fā)現(xiàn)一個問題,用戶手機與紙的距離是個問題课锌,如果用戶離著太遠(yuǎn)識別率非常低瓮床,只有在一個適當(dāng)?shù)木嚯x能基本很快就能識別出來,而且正確率非常高产镐。

我的解決方案就是通過在掃描界面上增加一個框隘庄,這里能夠有效控制用戶的距離

總結(jié)

最終實現(xiàn)了手機號的識別,不過這個識別速度要2到3秒癣亚,稍微慢了點丑掺,而且那個距離的解決也不是最好的。各位如果有什么好的解決方案可以與我聯(lián)系

我的博客

FlyOceanFish

chi_sim最新合成庫

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末述雾,一起剝皮案震驚了整個濱河市街州,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玻孟,老刑警劉巖唆缴,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異黍翎,居然都是意外死亡面徽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趟紊,“玉大人氮双,你說我怎么就攤上這事■伲” “怎么了戴差?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铛嘱。 經(jīng)常有香客問我暖释,道長,這世上最難降的妖魔是什么墨吓? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任饭入,我火速辦了婚禮,結(jié)果婚禮上肛真,老公的妹妹穿的比我還像新娘谐丢。我一直安慰自己,他們只是感情好蚓让,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布乾忱。 她就那樣靜靜地躺著,像睡著了一般历极。 火紅的嫁衣襯著肌膚如雪窄瘟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天趟卸,我揣著相機與錄音蹄葱,去河邊找鬼。 笑死锄列,一個胖子當(dāng)著我的面吹牛图云,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邻邮,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼竣况,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筒严?” 一聲冷哼從身側(cè)響起丹泉,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸭蛙,沒想到半個月后摹恨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡娶视,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年晒哄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡揩晴,死狀恐怖勋陪,靈堂內(nèi)的尸體忽然破棺而出贪磺,到底是詐尸還是另有隱情硫兰,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布寒锚,位于F島的核電站劫映,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刹前。R本人自食惡果不足惜泳赋,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喇喉。 院中可真熱鬧祖今,春花似錦、人聲如沸拣技。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膏斤。三九已至徐绑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莫辨,已是汗流浹背傲茄。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沮榜,地道東北人盘榨。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像蟆融,于是被迫代替她去往敵國和親较曼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容