栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java实现百度云OCR文字识别 高精度OCR识别身份证信息

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java实现百度云OCR文字识别 高精度OCR识别身份证信息

本文为大家分享了java实现百度云OCR识别的具体代码,高精度OCR识别身份证信息,供大家参考,具体内容如下

1.通用OCR文字识别

这种OCR只能按照识别图片中的文字,且是按照行识别返回结果,精度较低。

首先引入依赖包:


  com.baidu.aip
  java-sdk
  4.6.0

通过OCR工具类:

package util;
 
import com.baidu.aip.ocr.AipOcr;
import org.json.JSONObject;
import java.util.HashMap;
 
 
public class OcrApi {
  private static final String APP_ID = "你的 App ID";
  private static final String API_KEY = "Xb12m5t4jS2n7";
  private static final String SECRET_KEY = "9XVx9GPcSbSUTZ";
 
  private static AipOcr getAipClient() {
    return getAipClient(API_KEY, SECRET_KEY);
  }
 
  public static AipOcr getAipClient(String apiKey, String secretKey) {
    AipOcr client = new AipOcr(APP_ID, apiKey, secretKey);
    // 可选:设置网络连接参数
    client.setConnectionTimeoutInMillis(2000);
    client.setSocketTimeoutInMillis(60000);
    return client;
  }
 
  public static String result(AipOcr client) {
    // 传入可选参数调用接口
    HashMap options = new HashMap<>();
    options.put("language_type", "CHN_ENG");
    options.put("detect_direction", "true");
    options.put("detect_language", "true");
    options.put("probability", "true");
 
    JSonObject res = client.basicGeneralUrl(
 "https://lichunyu1234.oss-cn-shanghai.aliyuncs.com/1.png", options);
    return res.toString(2);
  }
 
  public static void main(String[] args) {
    System.out.println(result(getAipClient()));
  }
}

结果如下,识别有两行信息(words即是识别的信息):

2.高精度OCR识别身份证信息 

这种就比较高精度,且按照分类显示,返回数据更友好,高可用。

2.1 接口说明及请求参数是地址官方截图如下:

2.2 OCR身份证识别工具类

package util;
 
import com.alibaba.druid.util.base64;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
 
public class OcrUtil {
  // Access_Token获取
  private static final String ACCESS_TOKEN_HOST = "https://aip.baidubce.com/oauth/2.0/token?";
  // 身份证识别请求URL
  private static final String OCR_HOST = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?";
  // apiKey,secretKey
  private static final String API_KEY ="Xb12m5t4jS";
  private static final String SECRET_KEY = "9XVx9GPcSbSUT";
 
 
  // 获取百度云OCR的授权access_token
  public static String getAccessToken() {
    return getAccessToken(API_KEY, SECRET_KEY);
  }
 
  
  public static String getAccessToken(String apiKey, String secretKey) {
    String accessTokenURL = ACCESS_TOKEN_HOST
 // 1. grant_type为固定参数
 + "grant_type=client_credentials"
 // 2. 官网获取的 API Key
 + "&client_id=" + apiKey
 // 3. 官网获取的 Secret Key
 + "&client_secret=" + secretKey;
 
    try {
      URL url = new URL(accessTokenURL);
      // 打开和URL之间的连接
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setRequestMethod("GET");
      connection.connect();
 
      // 获取响应头
      Map> map = connection.getHeaderFields();
      // 遍历所有的响应头字段
      for (String key : map.keySet()) {
 System.out.println(key + "---->" + map.get(key));
      }
 
      // 定义 BufferedReader输入流来读取URL的响应
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
      StringBuilder result = new StringBuilder();
      String inputLine;
      while ((inputLine = bufferedReader.readLine()) != null) {
 result.append(inputLine);
      }
      JSonObject jsonObject = JSONObject.parseObject(result.toString());
      return jsonObject.getString("access_token");
 
    } catch (Exception e) {
      e.printStackTrace();
      System.err.print("获取access_token失败");
    }
    return null;
  }
 
  
  public static String getStringIdentityCard(File imageUrl, String idCardSide) {
    // 身份证OCR的http URL+鉴权token
    String OCRUrl = OCR_HOST+"access_token="+getAccessToken();
    System.out.println(OCRUrl);
    System.out.println("***************************************************");
    System.out.println(getAccessToken());
    // 对图片进行base64处理
    String image = encodeImageTobase64(imageUrl);
    // 请求参数
    String requestParam = "detect_direction=true&id_card_side="+idCardSide+"&image="+image;
 
    try {
      // 请求OCR地址
      URL url = new URL(OCRUrl);
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      // 设置请求方法为POST
      connection.setRequestMethod("POST");
 
      // 设置请求头
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      connection.setRequestProperty("apiKey", API_KEY);
      connection.setDoOutput(true);
      connection.getOutputStream().write(requestParam.getBytes(StandardCharsets.UTF_8));
      connection.connect();
 
      // 定义 BufferedReader输入流来读取URL的响应
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
      StringBuilder result = new StringBuilder();
      String inputLine;
      while ((inputLine = bufferedReader.readLine()) != null) {
 result.append(inputLine);
      }
      bufferedReader.close();
      return result.toString();
    } catch (Exception e) {
      e.printStackTrace();
      System.err.println("身份证OCR识别异常");
      return null;
    }
  }
 
  
  public static String encodeImageTobase64(File imageUrl) {
    // 将图片文件转化为字节数组字符串,并对其进行base64编码处理
    byte[] data = null;
    try {
      InputStream inputStream = new FileInputStream(imageUrl);
      data = new byte[inputStream.available()];
      inputStream.read(data);
      inputStream.close();
 
      // 对字节数组base64编码
      return URLEncoder.encode(base64.byteArrayTobase64(data), "UTF-8");
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
 
  }
 
  
  public static Map getIdCardInfo(MultipartFile image, int idCardSide) {
    String value = getStringIdentityCard(image, idCardSide);
    String side;
    if (idCardSide == 1) {
      side = "正面";
    }else {
      side = "背面";
    }
    Map map = new HashMap<>();
    JSonObject jsonObject = JSONObject.parseObject(value);
    JSonObject words_result = jsonObject.getJSonObject("words_result");
    if (words_result == null || words_result.isEmpty()) {
      throw new MyException("请提供身份证"+side+"图片");
    }
    for (String key : words_result.keySet()) {
      JSonObject result = words_result.getJSonObject(key);
      String info = result.getString("words");
      switch (key) {
 case "姓名":
   map.put("name", info);
   break;
 case "性别":
   map.put("sex", info);
   break;
 case "民族":
   map.put("nation", info);
   break;
 case "出生":
   map.put("birthday", info);
   break;
 case "住址":
   map.put("address", info);
   break;
 case "公民身份号码":
   map.put("idNumber", info);
   break;
 case "签发机关":
   map.put("issuedOrganization", info);
   break;
 case "签发日期":
   map.put("issuedAt", info);
   break;
 case "失效日期":
   map.put("expiredAt", info);
   break;
      }
    }
    return map;
 
  }
 
}

官方返回示例:

对于身份证识别有个大坑:

1.有的base64编码后有头部“base64:”要去掉,阿里巴巴的base64可以正常使用。

2.OCR识别官方只说明图片要base64编码,但是实际上还是要再UrlEncode再编码一次才可以。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/139623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号