身份证图片拍照存在亮度不均的情况,导致过滤出现部分区域无法识别。
初步解决办法:
1.切割图片,按照区域坐标切割出名字,身份证号两块大致区域。再将身份证号切割成多个小图片(因为号码较长,光线不均匀情况很明显) 前端拍照时通过摄像头提示框解决切割图片
2.色彩过滤,忽略RGB值超过300的像素,将其调整为-1变为白色。(300这个阈值需要根据实际图片进行调整,如果光线过强,则数值要调大一些) 通过OpenCV进行二值化、去噪点。(如果是进行验证码识别,还需要RGB分层等算法进行过滤杂质,比较复杂后续有时间会研究)
3.图片拼接,将多段身份证号码的小图片重新拼接然后进行OCR识别。 经过上面两步之后已经解决问题
继续。
切割图片直接用java自带的包根据坐标来解决,拍照倾斜角造成了图片曝光不均的问题严重影响解析,找了下资料准备使用opencv提供的局部自适应阈值图像二值化来试试。web下使用opencv出现Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java249 in java.library.path,而且服务器是在linux上,先去服务器安装opencv。
2017.9.1日继续
身份证识别功能基本完成。
使用opencv对图片进行二值化(可以去除光线造成的曝光不均问题)、去噪点(忽略小区域像素,这点非常重要。我使用了点手段,通过缩放和扩大来,试了下缩2扩2连续3-4次效果比较好)
tess4j进行文本识别。直接上maven
正则过滤保留数字、中文、字母。
.String reg = "[^a-zA-Z0-9\\u4e00-\\u9fa5]";
result = result.replaceAll(reg, "");
身份证号验证规则验证号码正确性。
网友评论