項目地址 本項目基於tesseract與OpenCV,已經在咱們的APP
中使用快一年時間。由於我只訓練了身份證號部分的字體,因此目前只能識別身份證號。項目中本想使用Tesseract-OCR-iOS的,但當時它還不支持bitcode
(如今已經支持),而咱們的APP
因爲須要支持Watch
而必須支持bitcode
,因此就本身編譯了當時最新的tesseract
版本。若是項目不須要支持bitcode
,推薦看一下ocr_savingCard,只惋惜這個庫中的兩個核心.a文件沒有公開源碼。git
咱們首先根據身份證的真實比例,固定一個矩形框,並提示用戶將身份證置於矩形框中進行掃描,這樣就能夠根據矩形框的位置,在整張照片中截取出身份證部分,後續進行圖片處理時,就只須要處理截取出來的身份證部分。github
裁剪前: 學習
裁剪後:在獲取照片過程當中,可能會受到其餘信號的干擾,在圖像上造成一些零散孤立的像素點,這些像素點對後面圖像處理的影響比較大,所以在進行圖像處理前,須要對圖像進行去噪處理。字體
彩色圖像中的每一個像素的顏色有R、G、B三個份量決定,而每一個份量有255中值可取,這樣一個像素點能夠有1600多萬(255x255x255)的顏色的變化範圍。而灰度圖像是R、G、B三個份量相同的一種特殊的彩色圖像,其一個像素點的變化範圍爲255種,因此將彩色圖像轉化成灰度圖像,能夠大大減小後續的圖像處理計算量。 .net
圖像二值化就是將像素點的灰度置爲0或255,全部灰度大於或等於閥值的像素被斷定爲屬於特定物體,其灰度值爲255表示,不然這些像素點被排除在物體區域之外,灰度值爲0,則表示背景或者例外的物體區域。閾值對二值化處理的結果影響比較大,因爲咱們不能控制用戶的拍攝環境,若是直接選定一個固定閾值,最後處理的結果在不一樣的光照條件下是有明顯差異的,因此選擇一個固定的閾值並非一個很好的解決方案。還好最後發現了一個很好的解決在不一樣光照條件下進行二值化處理的方案,感興趣的能夠看一下。基於opencv的一種局部自適應快速二值化方法(積分法) 3d
腐蝕是一種消除邊界點,使邊界向內部收縮的過程。能夠用來消除小且無心義的物體。腐蝕的意義在於能夠消除不少無心義的輪廓形象,減小後面輪廓提取的運算量,更加容易獲取所需位置的區域。 code
通過輪廓提取能夠獲得許多不一樣的矩形塊,咱們能夠根據這些矩形塊的座標位置以及寬高比例,篩選出身份證號所在的矩形塊。 cdn
最後的識別工做交由tesseract
完成,這裏因爲對tesseract
沒有過多的瞭解,就不作過多介紹,但願對tesseract
有研究的同窗能夠不吝賜教。blog
本人嘗試過加入銀行卡號識別和身份證上的文字識別,可是因爲手中並無足夠的樣本進行模型訓練,也曾嘗試過tesseract
官方推出的中文模型包,可是效果並很差。對OCR
感興趣的同窗能夠加入我建立的QQ羣:777044924,你們一塊兒學習探討,首先聲明,本羣僅爲技術討論羣,發廣告必踢!!!圖片