身份證圖片拍照存在亮度不均的情況,導致過濾出現(xiàn)部分區(qū)域無法識別。
初步解決辦法:
1.切割圖片,按照區(qū)域坐標切割出名字,身份證號兩塊大致區(qū)域。再將身份證號切割成多個小圖片(因為號碼較長,光線不均勻情況很明顯)? ? 前端拍照時通過攝像頭提示框解決切割圖片
2.色彩過濾,忽略RGB值超過300的像素,將其調(diào)整為-1變?yōu)榘咨#?00這個閾值需要根據(jù)實際圖片進行調(diào)整,如果光線過強,則數(shù)值要調(diào)大一些)? ?通過OpenCV進行二值化、去噪點。(如果是進行驗證碼識別,還需要RGB分層等算法進行過濾雜質(zhì),比較復雜后續(xù)有時間會研究)
3.圖片拼接,將多段身份證號碼的小圖片重新拼接然后進行OCR識別。? 經(jīng)過上面兩步之后已經(jīng)解決問題
繼續(xù)。
切割圖片直接用java自帶的包根據(jù)坐標來解決,拍照傾斜角造成了圖片曝光不均的問題嚴重影響解析,找了下資料準備使用opencv提供的局部自適應閾值圖像二值化來試試。web下使用opencv出現(xiàn)Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java249 in java.library.path,而且服務器是在linux上,先去服務器安裝opencv。
2017.9.1日繼續(xù)
身份證識別功能基本完成。
使用opencv對圖片進行二值化(可以去除光線造成的曝光不均問題)、去噪點(忽略小區(qū)域像素,這點非常重要。我使用了點手段,通過縮放和擴大來,試了下縮2擴2連續(xù)3-4次效果比較好)
tess4j進行文本識別。直接上maven

正則過濾保留數(shù)字、中文、字母。
.String reg = "[^a-zA-Z0-9\\u4e00-\\u9fa5]";
result = result.replaceAll(reg, "");
身份證號驗證規(guī)則驗證號碼正確性。