java实现的身份证照片脸部识别(头像截图) 以及OCR字体识别

断断续续地折腾了大半个月,终于把身份证照片脸部识别以及OCR字体识别功能用Java实现了,需求很简单:通过摄像头所照的一张放在黑色底板上的身份证照,识别照片上身份证里面的人名和地址(OCR中文),再截取身份证上的头像用Base64编码。生成一个规定格式的XML然后把人名,地址和头像照片的编码放到XML里面。

其中用到了OpenCV, Tesseract-OCR 还有一些对BufferedImage进行图像处理的东西。代码倒也不算很复杂,但是其中几个问题的确很烧脑细胞,花了不少时间才解决(Jedi本人辛苦开发+原创码字博文共享,希望能):

1.  相片里面身份证的位置不确定问题: 底板比较大身份证可以在上面随意位置摆放

解决方法很简单,人脸识别时候把人脸的位置坐标返回出来,利用这个坐标来确定身份证位置也大大缩小需要字体OCR识别的区域。不需要整张照片做OCR也节省了许多运算时间。

2.  OpenCV人脸识别的容错率问题(有时候一张照片可以识别出三个头像来, 连个模糊的色块也能识别为一个头像,汗啊),当然了,识别人脸时候需要的lbpcascade_frontalface.xml是必须的。上网找就有不少地方有的下载。运行时需要这个xml位于你的可运行jar所在的同个路径下

解决方法是思路就是指定进行人脸识别的最大和最小像素范围minSize和maxSize(就是多大尺寸以内才去分析是不是人脸,当然要具体情况具体设置,minsize最好设大一点点,不然一个模糊小色块都会可能被误当作是人脸,T_T),然后设置参数scaleFactor,minNeighbors和flags来提高识别正确率,具体代码如下:

      public int[] detectFace(String imageFileName) {

            int[] RectPosition = new int[4];

            CascadeClassifier faceDetector = new CascadeClassifier("lbpcascade_frontalface.xml");

            Mat image = Highgui.imread(imageFileName);

            MatOfRect faceDetections = new MatOfRect();

            //指定人脸识别的最大和最小像素范围

            Size minSize = new Size(120, 120);

            Size maxSize = new Size(250, 250);

//参数设置为scaleFactor=1.1f, minNeighbors=4, flags=0 以此来增加识别人脸的正确率

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值