java实现百度云OCR文字识别 高精度OCR识别身份证信息
作者:tobe27 发布时间:2023-10-24 13:50:37
标签:java,OCR,识别
本文为大家分享了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即是识别的信息):
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);
}
/**
* 获取百度云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;
}
}
官方返回示例:
对于身份证识别有个大坑:
1.有的base64编码后有头部“Base64:”要去掉,阿里巴巴的base64可以正常使用。
2.OCR识别官方只说明图片要Base64编码,但是实际上还是要再UrlEncode再编码一次才可以。
来源:https://blog.csdn.net/weixin_42058600/article/details/82709590
0
投稿
猜你喜欢
- 一维数组1.一维数组的定义方式:int[] array1 = new int[3];//声明创建一个包含3个元素的数组array1(初始值为
- 大家好,这是 [C#.NET 拾遗补漏] 系列的第 07 篇文章。在 C# 中,大多数方法都是通过 return 语句立即把程序的控制权交回
- 前言:quartz是一个定时调度的框架,就目前市场上来说,其实有比quartz更优秀的一些定时调度框架,不但性能比quartz好,学习成本更
- 本Demo使用三个类一个Test类一个自定义的Stack类一个自定义的Queue类可以实现的功能:1.对于一个写在文本文件中的迷宫,能够将其
- 前言哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下
- springboot用以进行web项目开发的便捷性,本文不再赘述,主要是想将工作中基于springboot与gradle的多模块项目的构建经
- mybatis官网中文文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.htmlmybatis-
- 在上一篇文章《驱动开发:内核字符串转换方法》中简单介绍了内核是如何使用字符串以及字符串之间的转换方法,本章将继续探索字符串的拷贝与比较,与应
- 用java压缩/解压文件: import java.io.*; import java.awt.*; import java.aw
- 一、二叉搜索树插入元素/** * user:ypc; * date:2021-05-18; * time: 15:09; */
- 一个图片识别小工具,原先主要是识别以前公司的软件注册码截图里的数字和字母(每次要一个一个框复制出来粘贴到注册器里,很麻烦!),因为注册码出现
- hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们
- 今天我们介绍的是jpa删除和事务的一些坑,接下来看看具体内容。业务场景(这是一个在线考试系统)和代码:根据问题的id删除答案reposito
- 一般情况下每个spring boot工程启动都有固定的端口,但是固定端口不利用服务的动态扩容,如果在一台服务器上需要对同一个服务进行多实例部
- 如果你是一名Web开发人员,那么用膝盖想也知道你的职业生涯大部分将使用Java而度过。这是一款商业级的编程语言,我们没有办法不接触它。对于J
- 前言这几天听朋友说JPA很好用,根本不用写sql。我在想一个程序员不写sql还能叫程序员?而且越高级的工具封装越多的工具,可拓展性和效率就非
- 本文实例为大家分享了java实现酒店管理系统的具体代码,供大家参考,具体内容如下编写环境:MyEclipse2014+sql server2
- 本文中我们会讲解如何在Spring Boot JPA中实现class和数据表格的映射。默认实现Spring Boot JPA底层是用Hibe
- iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下:#import <CoreLo
- C#实现多态主要有3种方法,虚方法,抽象类,接口1 虚方法在父类的方法前面加关键字virtual, 子类重写该方法时在方法名前面加上over