百度智能云文字识别
https://ai.baidu.com/
创建应用
参考博客:
Java基于百度API接口实现智慧文字识别
百度AI开放平台,文字识别接口
获取access token
百度AI - 对接百度AI 增值税发票识别接口
Java 百度ocr文字识别-发票识别,并在页面显示信息
OCR识别接口
- 通用文字标准版识别接口:https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic
- 通用文字 标准版识别,含位置信息 https://aip.baidubce.com/rest/2.0/ocr/v1/general
- 通用文字 高精度版识别 https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic
- 通用文字 高精度,含位置信息 https://aip.baidubce.com/rest/2.0/ocr/v1/accurate
具体实现代码
整合Java基于百度API接口实现智慧文字识别与Java 百度ocr文字识别-发票识别,并在页面显示信息两篇博客的代码。
cotroller
@RequestMapping(value="/ocrFromScreen")
@ResponseBody
public List<Agri_produce_plot> ocrFromScreen() {
OcrTools ocrTools = new OcrTools();
GetImageFromScreen getImageFromScreen = new GetImageFromScreen();
String filePath = getImageFromScreen.getpath();
try {
File file = new File(filePath);
InputStream in = new FileInputStream(file);
String ocrResult = ocrTools.getocrByInputStream(in);
Map resultMap = JSONObject.parseObject(ocrResult,Map.class);
JSONArray wordsResult = (JSONArray) resultMap.get("words_result");
String[] blockIDarr = new String[wordsResult.size()];
String firstBlockID = (String) wordsResult.getJSONObject(0).get("words");
blockIDarr[0] = firstBlockID;
List<Agri_produce_plot> list = ocrService.FindAgriByBlockID(firstBlockID);//先初始化list
if (wordsResult.size() > 1){
for (int i = 1; i<wordsResult.size();i++){
String blockID = (String) wordsResult.getJSONObject(i).get("words");
blockIDarr[i] = blockID;
List<Agri_produce_plot> agriItem = ocrService.FindAgriByBlockID(blockID);
if (agriItem.size() > 1){
for (int j = 0; j< agriItem.size();j++){
list.add(agriItem.get(j));
}
}else {
list.add(agriItem.get(0));
}
}
}
String invoiceString = JSONObject.toJSONString(resultMap.get("words_result"));
return list;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
获取桌面截图
public class GetImageFromScreen {
//图片路径
public static String getpath(){
String Image_path = null;
try {
Image image = GetImageFromScreen.getImageFromClipboard();
File file = new File("D:\\screen.jpg");
//转成jpg
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null),
image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = bufferedImage.createGraphics();
graphics2D.drawImage(image,null,null);
ImageIO.write((RenderedImage)bufferedImage,"jpg",file);
Image_path = file.getPath();
}catch (Exception e){
e.printStackTrace();
}
return Image_path;
}
//从粘贴板获取截图
public static Image getImageFromClipboard() throws Exception{
Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable cc = sysc.getContents(null);
if (cc == null){
return null;
}
else if (cc.isDataFlavorSupported(DataFlavor.imageFlavor)){
return (Image) cc.getTransferData(DataFlavor.imageFlavor);
}
return null;
}
}
识别工具类
public class OcrTools {
/**
* 识别图片
* @param
* @return 识别结果
*/
public static String getocrByInputStream(InputStream in){
byte[] fileByte = getFileBytes(in);// 获取图片字节数组
String base64UrlencodedImg = base64Urlencode(fileByte);// 编码
return sendOcr(base64UrlencodedImg);// 发送给百度进行文字识别
}
/**
* 传入base64 + UrlEncode 编码后的图片
* 得到图片解析结果字符串(百度返回的Json)
* @param base64UrlencodedImg
* @return
* @throws ClientProtocolException
* @throws IOException
*/
public static String sendOcr(String base64UrlencodedImg){
CloseableHttpClient httpclient = HttpClients.createMinimal();
//invoice识别发票,general_basic识别通用文字
HttpPost post = new HttpPost("https://aip.baidubce.com/rest/2.0/ocr/v1/accurate?access_token=24.5fe..........");//填入自己申请的token
Header header = new BasicHeader("Content-Type","application/x-www-form-urlencoded");
post.setHeader(header);
try {
HttpEntity entity = new StringEntity("image=" + base64UrlencodedImg);
post.setEntity(entity);
CloseableHttpResponse response = httpclient.execute(post);
InputStream in = response.getEntity().getContent();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1000];
int n;
while ((n = in.read(b)) != -1) {
bos.write(b, 0, n);
}
in.close();
bos.close();
byte[] buffer = bos.toByteArray();
return new String(buffer,"utf-8");
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 图片转字节数组
* @param
* @return 图片字节数组
*/
private static byte[] getFileBytes(InputStream in){
byte[] buffer = null;
try {
// File file = new File(filePath);
// FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1000];
int n;
while ((n = in.read(b)) != -1) {
bos.write(b, 0, n);
}
in.close();
bos.close();
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer;
}
/**
* 对字节数组进行base64编码与url编码
* @param b
* @return
*/
private static String base64Urlencode(byte[] b) {
byte[] base64Img = Base64.getEncoder().encode(b);
try {
String base64UrlencodedImg = URLEncoder.encode(new String(base64Img), "utf-8");
return base64UrlencodedImg;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* InputStream 转String
* @param is
* @return
*/
public String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "/n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}