iOS身份證號識別

sansansisi發表於2018-05-01

效果

圖片

簡介

專案地址 本專案基於tesseractOpenCV,已經在我們的APP中使用快一年時間。因為我只訓練了身份證號部分的字型,所以目前只能識別身份證號。專案中本想使用Tesseract-OCR-iOS的,但當時它還不支援bitcode(現在已經支援),而我們的APP由於需要支援Watch而必須支援bitcode,所以就自己編譯了當時最新的tesseract版本。如果專案不需要支援bitcode,推薦看一下ocr_savingCard,只可惜這個庫中的兩個核心.a檔案沒有公開原始碼。

實現原理

裁剪圖片

我們首先根據身份證的真實比例,固定一個矩形框,並提示使用者將身份證置於矩形框中進行掃描,這樣就可以根據矩形框的位置,在整張照片中擷取出身份證部分,後續進行圖片處理時,就只需要處理擷取出來的身份證部分。

裁剪前:

裁剪前
裁剪後:
裁剪後

去噪

在獲取照片過程中,可能會受到其他訊號的干擾,在影像上形成一些零散孤立的畫素點,這些畫素點對後面影像處理的影響比較大,因此在進行影像處理前,需要對影像進行去噪處理。

灰度化

彩色影像中的每個畫素的顏色有R、G、B三個分量決定,而每個分量有255中值可取,這樣一個畫素點可以有1600多萬(255x255x255)的顏色的變化範圍。而灰度影像是R、G、B三個分量相同的一種特殊的彩色影像,其一個畫素點的變化範圍為255種,所以將彩色影像轉化成灰度影像,可以大大減少後續的影像處理計算量。

灰度化

二值化

影像二值化就是將畫素點的灰度置為0或255,所有灰度大於或等於閥值的畫素被判定為屬於特定物體,其灰度值為255表示,否則這些畫素點被排除在物體區域以外,灰度值為0,則表示背景或者例外的物體區域。閾值對二值化處理的結果影響比較大,由於我們不能控制使用者的拍攝環境,如果直接選定一個固定閾值,最後處理的結果在不同的光照條件下是有明顯差別的,所以選擇一個固定的閾值並不是一個很好的解決方案。還好最後發現了一個很好的解決在不同光照條件下進行二值化處理的方案,感興趣的可以看一下。基於opencv的一種區域性自適應快速二值化方法(積分法)

二值化

腐蝕

腐蝕是一種消除邊界點,使邊界向內部收縮的過程。可以用來消除小且無意義的物體。腐蝕的意義在於可以消除很多無意義的輪廓形象,減少後面輪廓提取的運算量,更加容易獲取所需位置的區域。

腐蝕

輪廓提取

經過輪廓提取可以得到許多不同的矩形塊,我們可以根據這些矩形塊的座標位置以及寬高比例,篩選出身份證號所在的矩形塊。

輪廓提取
結果

識別

最後的識別工作交由tesseract完成,這裡由於對tesseract沒有過多的瞭解,就不做過多介紹,希望對tesseract有研究的同學可以不吝賜教。

結語

本人嘗試過加入銀行卡號識別和身份證上的文字識別,但是由於手中並沒有足夠的樣本進行模型訓練,也曾嘗試過tesseract官方推出的中文模型包,但是效果並不好。對OCR感興趣的同學可以加入我建立的QQ群:777044924,大家一起學習探討,首先宣告,本群僅為技術討論群發廣告必踢!!!

相關文章