本文为大家分享了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再编码一次才可以。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
屏幕显示我试图从扫描的身份证中提取数据,但OCR的准确性有问题。名字后面有一些额外的小字,与身份证上的常规名字混淆了。表单识别器中的OCR不准确。我尝试了计算机视觉3.0预览读取应用编程接口,它工作正常。有没有办法将新的3.0计算机视觉OCR应用编程接口与表单识别器2.0一起使用?我看到一些留档,其中提到在容器中使用表单识别器时使用计算机视觉应用编程接口?如果我们使用云表单识别器应用编程接口而不是
树洞 OCR 文字识别是一款跨平台的 OCR 小工具 下载地址:百度网盘 提取码:m6d8 xxx-with-jre.xx 是完整版,带运行环境;如果精简版不能正常工作,请下载完整版使用; 文字识别使用了各云平台开发的识别接口,因此需要联网才能正常使用; 安装路径请勿包含中文字符; 本程序使用 JavaFX 开发,使用前请务必安装 Java8 运行环境(完整版无需安装 Java8)。 程序使用 启
更新时间:2019-07-19 10:48:36 节点简介 人脸识别/图像识别/OCR节点属于智能节点,区别在于封装的云市场api功能不同。人脸识别节点主要有人数检测、人脸身份证对比、性别年龄情绪识别等功能。图像识别节点主要有烟雾火焰火灾识别、动物识别、植物识别、植物花卉识别等功能。OCR节点主要有驾驶证识别、车牌识别、身份证识别等功能。 使用场景 如果您需要进行人数检测、人脸身份证对比、性别年龄
身份证识别是利用手机相机扫描二代身份证,然后通过OCR文字识别技术,将图像转换为文字,得到规范的证件信息文本。 1.功能介绍 支持身份证正反面识别。 可返回人脸截图。 可返回身份证裁剪图上的姓名和身份号码的区域位置。 支持蒙文、藏文、维文、壮文版身份证。 支持竖屏、横屏扫描(注:需在初始化时指定方向)。 扫描界面可定制。 2.身份证识别流程 3.身份证识别 SDK-Demo 当进行身份证识别时,我
身份证识别是利用手机相机扫描二代身份证,读取证件上的各栏位信息,然后通过 OCR 文字识别技术,将图像转换为文字,得到规范的证件信息文本。 1.功能介绍 支持身份证正反面识别。 可返回人脸截图。 可返回姓名、身份号码区域位置。 支持蒙文、藏文、维文、壮文版身份证。 支持竖屏、横屏扫描,在初始化时指定方向。 扫描界面可定制。 2.身份证识别流程 3.身份证识别 SDK-Demo 当进行身份证识别时,
本文向大家介绍Perl使用Tesseract-OCR实现验证码识别教程,包括了Perl使用Tesseract-OCR实现验证码识别教程的使用技巧和注意事项,需要的朋友参考一下 一、Tesseract-OCR 是什么 An OCR Engine that was developed at HP Labs between 1985 and 1995… and now at Google 基于Lepto