【百度OCR】java调用百度OCR接口实现文字识别

百度智能云文字识别
https://ai.baidu.com/
在这里插入图片描述
创建应用
在这里插入图片描述
参考博客:
Java基于百度API接口实现智慧文字识别
百度AI开放平台,文字识别接口
获取access token
百度AI - 对接百度AI 增值税发票识别接口
Java 百度ocr文字识别-发票识别,并在页面显示信息

OCR识别接口

  1. 通用文字标准版识别接口:https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic
  2. 通用文字 标准版识别,含位置信息 https://aip.baidubce.com/rest/2.0/ocr/v1/general
  3. 通用文字 高精度版识别 https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic
  4. 通用文字 高精度,含位置信息 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();   		 
	}   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值