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

作者:tobe27 时间:2023-10-24 13:50:37 

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

1.通用OCR文字识别

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

首先引入依赖包:


<dependency>
 <groupId>com.baidu.aip</groupId>
 <artifactId>java-sdk</artifactId>
 <version>4.6.0</version>
</dependency>

通过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<String, String> 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即是识别的信息):

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

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

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

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

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

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

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);
 }

/**
  * 获取百度云OCR的授权access_token
  * @param apiKey
  * @param secretKey
  * @return
  */
 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<String, List<String>> 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;
 }

/**
  * 获取身份证识别后的数据
  * @param imageUrl
  * @param idCardSide
  * @return
  */
 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;
   }
 }

/**
  * 对图片url进行Base64编码处理
  * @param imageUrl
  * @return
  */
 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;
   }

}

/**
  * 提取OCR识别身份证有效信息
  * @param
  * @return
  */
 public static Map<String, String> getIdCardInfo(MultipartFile image, int idCardSide) {
   String value = getStringIdentityCard(image, idCardSide);
   String side;
   if (idCardSide == 1) {
     side = "正面";
   }else {
     side = "背面";
   }
   Map<String, String> 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;

}

}

官方返回示例:

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

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

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

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

来源:https://blog.csdn.net/weixin_42058600/article/details/82709590

标签:java,OCR,识别
0
投稿

猜你喜欢

  • C#不重复输出一个数组中所有元素的方法

    2022-07-02 14:25:58
  • Android Camera+SurfaceView自动聚焦防止变形拉伸

    2023-06-18 06:35:54
  • JAVA中AES加密方法实例分析

    2023-12-18 13:09:40
  • SpringBoot使用Maven插件进行项目打包的方法

    2022-12-21 21:07:34
  • Java 集合的Contains和Remove方法

    2022-06-17 05:29:10
  • ViewFlipper实现上下翻滚轮播效果

    2023-10-06 08:55:40
  • 磁盘配额的wmi版本(C#)

    2022-07-31 17:55:17
  • C# 使用com获取Windows摄像头列表

    2022-11-03 09:50:49
  • C#在Winform开发中使用Grid++报表

    2022-04-20 03:57:13
  • Android实现底部导航栏功能(选项卡)

    2022-01-08 21:34:14
  • Java实现接口的枚举类示例

    2023-06-18 01:22:04
  • Maven入门之使用Nexus搭建Maven私服及上传下载jar包

    2022-05-06 20:47:43
  • java实现转圈打印矩阵算法

    2022-11-27 06:38:21
  • 字符串替换Replace仅替换第一个字符串匹配项

    2021-10-02 17:36:56
  • Java如何使用Query动态拼接SQL详解

    2022-12-31 09:40:14
  • 一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    2021-06-03 03:16:41
  • Mybatis-Plus 条件构造器示例详解

    2023-06-26 06:45:17
  • C#模拟实现鼠标自动点击与消息发送功能

    2023-02-09 08:51:14
  • Android Google AutoService框架使用详解

    2023-07-19 22:48:14
  • Java web的读取Excel简单实例代码

    2023-05-29 08:25:37
  • asp之家 软件编程 m.aspxhome.com