JAVA调用百度OCR实现身份证识别

业务需求要实现身份证照片识别,还是比较简单的,百度的API开发文档也写的比较清楚:https://ai.baidu.com/ai-doc/OCR/rk3h7xzck

首先准备工作要先申请创建百度账号、创建相对应用,获取API Key 和 Secret Key(创建成功后如下图:)
在这里插入图片描述
在创建应用之后,可以根据你需要完成的需求,领取免费的测试资源(如下图:)
在这里插入图片描述
在这里我就演示由本地上传的案例

1.准备pom文件

		<!--用于解析返回json数据,案例中没用到-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.46</version>
		</dependency>
		<!-- Http请求 -->
		<dependency>
			 <groupId>org.apache.httpcomponents</groupId>
			 <artifactId>httpclient</artifactId>
			 <version>4.5.5</version>
		</dependency>

2.获取Access_token
由于Access_token也会过期(有效期为30天),为了更好的实现需求,我们可以每次获取最新的Access_token,获取的方式也非常的简单。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

import org.json.JSONObject;

public class AccessTokenUtils {

	private static String APIKEY = "************************";

	private static String SecretKEY = "******************************";

	// 获取Token路径
	private static String PATH = "https://aip.baidubce.com/oauth/2.0/token?";

	public static String getAuth() {
		// 获取token地址
		String getAccessTokenUrl = PATH
				// 1. grant_type为固定参数
				+ "grant_type=client_credentials"
				// 2. 官网获取的 API Key
				+ "&client_id=" + APIKEY
				// 3. 官网获取的 Secret Key
				+ "&client_secret=" + SecretKEY;
		try {
			URL realUrl = new URL(getAccessTokenUrl);
			// 打开和URL之间的连接
			HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
			connection.setRequestMethod("GET");
			connection.connect();
			// 获取所有响应头字段
			Map<String, List<String>> map = connection.getHeaderFields();
			// 遍历所有的响应头字段
//			for (String key : map.keySet()) {
//				System.err.println(key + "--->" + map.get(key));
//			}
			// 定义 BufferedReader输入流来读取URL的响应
			BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			String result = "";
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
			/**
			 * 返回结果示例
			 */
//			System.err.println("result:" + result);

			JSONObject jsonObject = new JSONObject(result);
			String access_token = jsonObject.getString("access_token");
			return access_token;
		} catch (Exception e) {
			System.err.printf("获取token失败!");
			e.printStackTrace(System.err);
		}
		return null;
	}
}

3.本地上传需要将图片转为Base64码,Url图片可以直接传网络地址

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class BaseImg64Utils {
	/**
	 * 将一张本地图片转化成Base64字符串
	 * @param imgPath 本地图片地址
	 * @return 图片转化base64后再UrlEncode结果
	 */
	public static String getImageStrFromPath(String imgPath) {
		InputStream in = null;
		byte[] data = null;
		// 读取图片字节数组
		try {
			in = new FileInputStream(imgPath);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 对字节数组Base64编码
		BASE64Encoder encoder = new BASE64Encoder();
		// 返回Base64编码过的字节数组字符串
		return encoder.encode(data).replaceAll("\r\n", "").replaceAll("\\+", "%2B");
	}
}

4.调用API接口的方法,获取识别结果

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

import com.store.utils.AccessTokenUtils;
import com.store.utils.BaseImg64Utils;

public class XszOcrUtils {
	private static final String POST_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token="+ AccessTokenUtils.getAuth();

//必传参数:id_card_side=frontfront:身份证含照片的一面 -back:身份证带国徽的一面  自动检测身份证正反面,如果传参指定方向与图片相反,支持正常识别,返回参数image_status字段为"reversed_side"
	/**
	 * 识别本地图片的文字
	 *
	 * @param path 本地图片地址
	 * @return 识别结果,为json格式
	 * @throws URISyntaxException URI打开异常
	 * @throws IOException        io流异常
	 */
	public static String checkFile(String path) throws URISyntaxException, IOException {
		File file = new File(path);
		if (!file.exists()) {
			throw new NullPointerException("图片不存在");
		}
		String image = BaseImg64Utils.getImageStrFromPath(path);
		String param = "image=" + image + "&id_card_side=front";
		return post(param);
	}

	/**
	 * @param url 图片url
	 * @return 识别结果,为json格式
	 */
	public static String checkUrl(String url) throws IOException, URISyntaxException {
		String param = "url=" + url;
		return post(param);
	}


	/**
	 * 通过传递参数:url和image进行文字识别
	 *
	 * @param param 区分是url还是image识别
	 * @return 识别结果
	 * @throws URISyntaxException URI打开异常
	 * @throws IOException        IO流异常
	 */
	private static String post(String param) throws URISyntaxException, IOException {
		// 开始搭建post请求
		HttpClient httpClient = HttpClientBuilder.create().build();
		HttpPost post = new HttpPost();
		URI url = new URI(POST_URL);
		post.setURI(url);
		// 设置请求头,请求头必须为application/x-www-form-urlencoded,因为是传递一个很长的字符串,不能分段发送
		post.setHeader("Content-Type", "application/x-www-form-urlencoded");
		StringEntity entity = new StringEntity(param);
		post.setEntity(entity);
		HttpResponse response = httpClient.execute(post);
		if (response.getStatusLine().getStatusCode() == 200) {
			String str;
			try {
				/* 读取服务器返回过来的json字符串数据 */
				str = EntityUtils.toString(response.getEntity());
				return str;
			} catch (Exception e) {
				e.printStackTrace();
				return null;
			}
		}
		return null;
	}

	public static void main(String[] args) throws URISyntaxException, IOException {
			String checkFile = checkFile("D:\\sfz.jpg");
			System.out.println("========" + checkFile);
	}
}

5.识别结果(解析之后就是这样)
在这里插入图片描述

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 要在Java实现调用百度OCR票据识别服务,可以按照以下步骤进行: 1. 首先,我们需要获取百度AI开放平台的相关API Key和Secret Key。可以在百度AI开放平台的官方网站上注册并创建一个应用,然后获取到这两个关键的身份验证参数。 2. 在Java中,可以使用百度AI开放平台提供的Java SDK来调用相关服务。首先,需要确保项目中已经引入了百度OCRJava SDK依赖。 3. 创建一个OCRClient对象,并使用之前获取到的API Key和Secret Key进行身份验证。 4. 为要识别的票据准备好图片数据。可以使用Java的File类来读取本地图片文件,也可以直接使用网络上的图片URL。将图片数据转换为字节数组。 5. 调用票据识别的方法,传入要识别的图片数据。可以使用票据识别的方法来识别票据中的各种字段信息,如发票代码、发票号码等。 6. 处理返回的结果。根据百度OCR API的返回结果,解析出需要的字段信息,并进行相应的业务处理。 7. 最后,记得释放资源和处理异常情况,确保程序的稳定性和安全性。 这样,我们就可以在Java调用百度OCR票据识别服务了。记得在调用API之前,阅读相关文档和了解API的使用限制和注意事项,以确保调用的有效性。 ### 回答2: 在Java调用百度OCR票据识别功能,可以通过以下几个步骤来实现。 首先,需要在百度云AI平台上创建一个OCR应用,并获取应用的API Key和Secret Key。这些凭证将用于后续的认证和授权。 然后,需要引入百度AIP Java SDK,可以通过maven等方式将它添加到项目的依赖中,以便能够在代码中使用百度OCR相关的接口。 接下来,在代码中构建AipOcr对象,将API Key和Secret Key以及OCR接口的请求地址设置进去。可以通过AipOcr的实例来调用百度OCR相关的接口。 调用百度OCR票据识别功能时,可以通过调用AipOcr对象的receiptRecognize方法来实现。将票据图片的二进制数据作为参数传递给该方法即可。 对于返回的结果,可以通过解析返回的JSON数据来获取识别结果。如票据的种类、识别的文字内容、发票代码、发票号码等信息。 最后,根据需要对返回的识别结果进行处理和展示,可以输出到控制台,保存到文件,或者在界面上显示出来。 总结起来,调用百度OCR票据识别功能需要先获取API Key和Secret Key,然后引入百度AIP Java SDK,构建AipOcr对象,并调用相关接口进行票据识别。最后根据识别结果进行后续处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值