基于Java项目的OCR身份证识别

1,131 阅读2分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第6篇文章,点击查看活动详情

本人是做大数据开发,但是本人以前接触并学习很多图像的知识,所以对图像很敏感。下面以某度的一个接口,实现身份证识别案例(一颗算法开发的心在不断的跳动,哈哈!!!)

前言

身份证识别在很多场景都有应用,如:门禁卡,使用身份证扫描识别;App注册扫描认证等。现在我将我的方法分享给大家,希望对大家有所帮助,谢谢!

正文

注册某度开发者账户

先注册,然后进入某度智能云的官网,如果有账户就可以直接查找选择文字识别,创建应用,获取AppID、SecretKey 、API Key

创建项目

idea创建一个maven项目,在pom中添加相应的依赖jar.

<!-- 某度文字识别SDK -->
    <dependency>
        <groupId>com.baidu.aip</groupId>
        <artifactId>java-sdk</artifactId>
        <version>4.6.1</version>
    </dependency>
创建两个配置工具类
public class BaiduConfig {
    public static final String APP_ID = "***";//自己的
    public static final String API_KEY = "****";//自己的
    public static final String SECRET_KEY = "***";//自己的
}
public class Utils {
        
    /**
        将图像转为二进制数组
   * @param path
   * @return
   */
  public static byte[] readImageFile(String path){
        byte[] data = null;
        FileImageInputStream input = null;
        try {
          input = new FileImageInputStream(new File(path));
          ByteArrayOutputStream output = new ByteArrayOutputStream();
          byte[] buf = new byte[1024];
          int numBytesRead = 0;
          while ((numBytesRead = input.read(buf)) != -1) {
          output.write(buf, 0, numBytesRead);
          }
          data = output.toByteArray();
          output.close();
          input.close();
        }
        catch (FileNotFoundException ex1) {
          ex1.printStackTrace();
        }
        catch (IOException ex1) {
          ex1.printStackTrace();
        }
        return data;
      }
执行类IDCardRecogizeController
package com.juejin.yangwj.controller;

import com.baidu.aip.ocr.AipOcr;
import com.juejin.yangwj.config.BaiduConfig;
import com.juejin.yangwj.utils.ImageUtil;
import org.json.JSONObject;

import java.util.HashMap;

/**
 * @author yangwj
 * @date 2020/5/23 14:49
 */
public class IDCardRecogizeController {

    public static void main(String[] args) {
        IDCardRecogize();
    }

    public static void IDCardRecogize() {
        AipOcr client = new AipOcr(BaiduConfig.APP_ID, BaiduConfig.API_KEY, BaiduConfig.SECRET_KEY);
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("detect_direction", "true");
        options.put("detect_risk", "false");
        //背面照
        //String idCardSide = "back";
        //前面照
        String idCardSide = "front";

        // 参数为本地图片路径
        //String image = "D:\back.jpg";
        String image = "D:\front.png";
        JSONObject res = client.idcard(image, idCardSide, options);
        System.out.println(res.toString(2));

        // 参数为本地图片二进制数组
        byte[] file = ImageUtil.readImageFile(image);
        res = client.idcard(file, idCardSide, options);
        System.out.println(res.toString(2));

    }

}
测试效果

image.png

image.png

总结

基于Java语言进行OCR识别方式有很多,不仅限于使用云厂商的api,但是使用云厂商的好处是你不需要去维护这些接口,同时准确率也是有保障的。这是个人观点哈,如有问题,欢迎留言讨论。