Java实现百度云OCR接口识别图片文字信息(也包含身份证,银行卡识别,更新添加通用票据识别)

参考:
https://blog.csdn.net/weixin_40165004/article/details/82632229

1.需求背景
因项目需求,需要提取身份证、发票(9/16更新内容)、荣誉证书上的文字信息,与相关文件进行匹配,而查阅相关资料,经过对比之后,发现用百度OCR文字识别API服务可以相应解决相关问题,识别率较好。当然,还不能够做到完全匹配,也有其中不足的地方,例如,发票中公章信息不能提取;发票周围的线圈被识别成了数字,etc。毕竟是免费的嘛,配合学校科研还是可以的。如果实在介意,百度云OCR有专门的自定义模板文字识别,自定义模板文字识别技术文档可以参考。

首先需要成为百度AI开放平台的开发者,就是要有百度AI的账号,具体参照新手指南,完成相关操作之后,就可以获取密钥如下图所示。

2.项目文件总览

其中需要的jar包分别为

  1. Java文字识别SDK,下载地址,使用说明

解压后即可得到jar包如下所示

2.相关工具类FileUtil ,Base64Util ,HttpUtil, GsonUtils 请点击进行下载

3.相关代码
获取access_token
/**

  • @ Description:获取access_token代码
  • @ author: Joy
  • @ date:2018年9月12日下午8:27:30
    */
    package com.baidu.ai.api.auth;

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;

/**

  • @author Joy

/
public class AuthService {
/
*
* 获取权限token
* @return 返回示例:
* {
* “access_token”: “24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567”,
* “expires_in”: 2592000
* }
*/
public static String getAuth() {
// 官网获取的 API Key 更新为你注册的
String clientId = “替换为你的百度云应用的AK”;//百度云应用的AK
// 官网获取的 Secret Key 更新为你注册的
String clientSecret = “替换为你的百度云应用的SK”;//百度云应用的SK
return getAuth(clientId, clientSecret);
}

/**
 * 获取API访问token
 * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
 * @param ak - 百度云官网获取的 API Key
 * @param sk - 百度云官网获取的 Securet Key
 * @return assess_token 示例:
 * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
 */
public static String getAuth(String ak, String sk) {
    // 获取token地址
    String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
    String getAccessTokenUrl = authHost
            // 1. grant_type为固定参数
            + "grant_type=client_credentials"
            // 2. 官网获取的 API Key
            + "&client_id=" + ak
            // 3. 官网获取的 Secret Key
            + "&client_secret=" + sk;
    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;
}

}
通用识别类代码
/**

  • @ Description:OCR 通用识别类
  • @ author: Joy
  • @ date:2018年9月12日下午8:33:34
    */
    package com.baidu.ai.aip.orc;

import java.net.URLEncoder;

import com.baidu.ai.aip.util.FileUtil;
import com.baidu.ai.aip.util.HttpUtil;
import com.baidu.ai.api.auth.AuthService;
import com.baidu.aip.util.Base64Util;

/**

  • @author Joy

/
public class General {
/
*
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
/
public static void main(String[] args) {
// 通用识别url
String otherHost = “https://aip.baidubce.com/rest/2.0/ocr/v1/general”;
// 本地图片路径
String filePath = “E:\find.png”;//#####本地文件路径#####
try {
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String params = URLEncoder.encode(“image”, “UTF-8”) + “=” + URLEncoder.encode(imgStr, “UTF-8”);
/
*
* 线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
/
String accessToken = AuthService.getAuth();//#####调用鉴权接口获取的token#####
String result = HttpUtil.post(otherHost, accessToken, params);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
通用识别类,包含位置高精度
/
*

  • @ Description:含位置高精度版
  • @ author: Joy
  • @ date:2018年9月12日下午8:56:35
    */
    package com.baidu.ai.aip.orc;

import java.net.URLEncoder;

import com.baidu.ai.aip.util.FileUtil;
import com.baidu.ai.aip.util.HttpUtil;
import com.baidu.ai.api.auth.AuthService;
import com.baidu.aip.util.Base64Util;

/**

  • @author Joy

/
public class General2 {
/
*
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
/
public static void main(String[] args) {
// 通用识别url
String otherHost = “https://aip.baidubce.com/rest/2.0/ocr/v1/general”;
// 本地图片路径
String filePath = “E:\find.png”;//#####本地文件路径#####
try {
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String params = URLEncoder.encode(“image”, “UTF-8”) + “=” + URLEncoder.encode(imgStr, “UTF-8”);
/
*
* 线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
/
String accessToken = AuthService.getAuth();//#####调用鉴权接口获取的token#####
String result = HttpUtil.post(otherHost, accessToken, params);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
身份证识别
/
*

  • @ Description:身份证识别
  • @ author: Joy
  • @ date:2018年9月12日下午8:58:42
    */
    package com.baidu.ai.aip.orc;

import java.awt.Color;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;

import com.baidu.ai.aip.util.FileUtil;
import com.baidu.ai.aip.util.HttpUtil;
import com.baidu.ai.api.auth.AuthService;
import com.baidu.aip.util.Base64Util;

/**

  • @author Joy

/
public class Idcard {
/
*
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
*/
public static void main(String[] args) {
// 身份证识别url
String idcardIdentificate = “https://aip.baidubce.com/rest/2.0/ocr/v1/idcard”;
// 本地图片路径
String filePath = “E://IDCard4.jpg”;//#####本地文件路径#####

//
// 彩色照片转黑白 如果需要可以使用,嗯,不用也行
//
// JFileChooser jChooser = new JFileChooser();
// 设置默认的打开目录,如果不设的话按照window的默认目录(我的文档)
// jChooser.setCurrentDirectory(new File(“E://”));
// 打开一个对话框
// int index = jChooser.showDialog(null, “打开文件”);
// if (index == JFileChooser.APPROVE_OPTION) {
// filePath = jChooser.getSelectedFile().getAbsolutePath();
// }
// Image img = new ImageIcon(filePath).getImage();
// BufferedImage bfi = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);
// bfi.getGraphics().drawImage(img, 0, 0,null);
// for(int y=0;y<bfi.getHeight();y++)
// for(int x=0;x<bfi.getWidth();x++) {
// Color pixel = new Color(bfi.getRGB(x, y));
// bfi.setRGB(x, y,new Color(getGray(pixel),getGray(pixel),getGray(pixel)).getRGB());
// }
// try {
// ImageIO.write(bfi, “JPEG”, new File(“IDCard3.jpg”));
// System.out.println(“照片转黑白成功la!!!”);
// } catch (IOException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }

    try {
        byte[] imgData = FileUtil.readFileByBytes(filePath);
        String imgStr = Base64Util.encode(imgData);
        // 识别身份证正面id_card_side=front;识别身份证背面id_card_side=back;
        String params = "id_card_side=front&" + URLEncoder.encode("image", "UTF-8") + "="
                + URLEncoder.encode(imgStr, "UTF-8");
        /**
         * 线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
         */
        String accessToken = AuthService.getAuth();//#####调用鉴权接口获取的token#####
        String result = HttpUtil.post(idcardIdentificate, accessToken, params);
        System.out.println(result);
        int count = 1;
        for (int i = 0; i < result.length();i++){
        	System.out.print(result.charAt(i));
        	count++;
        	if (count%120 == 0){
        		System.out.print("\n");
        	}
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static int getGray(Color pixel) {
    return (pixel.getRed()*30+pixel.getGreen()*60+pixel.getBlue()*10)/100;
}

}
银行卡识别
/**

  • @ Description:银行卡识别
  • @ author: Joy
  • @ date:2018年9月12日下午9:00:11
    */
    package com.baidu.ai.aip.orc;

import java.net.URLEncoder;

import com.baidu.ai.aip.util.FileUtil;
import com.baidu.ai.aip.util.HttpUtil;
import com.baidu.ai.api.auth.AuthService;
import com.baidu.aip.util.Base64Util;

/**

  • @author Joy

/
public class Bankcard {
/
*
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
/
public static void main(String[] args) {
// 银行卡识别url
String bankcardIdentificate = “https://aip.baidubce.com/rest/2.0/ocr/v1/bankcard”;
// 本地图片路径
String filePath = “E://bankCard.jpg”;//"#####本地文件路径#####"
try {
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String params = URLEncoder.encode(“image”, “UTF-8”) + “=” + URLEncoder.encode(imgStr, “UTF-8”);
/
*
* 线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
*/
String accessToken = AuthService.getAuth();//"#####调用鉴权接口获取的token#####"
String result = HttpUtil.post(bankcardIdentificate, accessToken, params);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
9/16更新:通用票据识别

/**

  • @ Description:通用票据识别
  • @ author: Joy
  • @ date:2018年9月16日下午9:06:31
    */
    package com.baidu.ai.aip.orc;

import java.net.URLEncoder;

import com.baidu.ai.aip.util.FileUtil;
import com.baidu.ai.aip.util.HttpUtil;
import com.baidu.ai.api.auth.AuthService;
import com.baidu.aip.util.Base64Util;

/**

  • @author Joy

/
public class Receipt {
/
*
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
/
public static void main(String[] args) {
// 通用票据识别url
String receipt = “https://aip.baidubce.com/rest/2.0/ocr/v1/receipt”;
// 本地图片路径
String filePath = “E://FP.jpg”;//"#####本地文件路径#####"
try {
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String params = URLEncoder.encode(“image”, “UTF-8”) + “=” + URLEncoder.encode(imgStr, “UTF-8”);
/
*
* 线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
*/
String accessToken = AuthService.getAuth();//"#####调用鉴权接口获取的token#####"
String result = HttpUtil.post(receipt, accessToken, params);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.注意事项
代码测试过了的,都真实可用,其中身份证识别还有段彩色转黑白的代码,不用也行,注释了就好。使用时注意将图片的地址改成你本地的地址就好。相关包的目录项截图也都在,进行对比建包建类即可。如果识别身份证只是缺少身份证号码的话,可以参考我另一篇博客,有详细说原因,链接。其实就是百度OCR对身份证号码有个校验。通过使用百度OCR接口,使Joy深刻认识到读懂技术文档的重要性。对于其识别的准确率,可以说一般使用是足够的。如果大家有什么问题欢迎留言或者联系Joy,知无不言言无不尽。QQ:2964328861。另外,近期再尝试使用SDK方式使用百度OCR文字识别,整理好之后再发一篇博客,相应代码移步下载吧,嗯,一起进步,如能赐教将不胜感激。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值