Java-基于百度API的图片文字识别 简单示例

百度具体文档中心:http://ai.baidu.com/docs#/OCR-API/e1bd77f3

具体的注册、创建应用可以从文档中心的新手指南开始看下,文档都写的很清楚明白。

直接上代码了:

1、获取 access_token:

package com.baidu;

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 com.alibaba.fastjson.JSONObject;


public class AccessToken {
			
    /**
     * 获取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.out.println("result:" + result);
            JSONObject jsonObject = JSONObject.parseObject(result);
            String access_token = jsonObject.getString("access_token");
            return access_token;
        } catch (Exception e) {
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
        return null;
    }
    
    
    public static void main(String[] args) {
    	String ac = getAuth("rYlaI2pjuU2g1lMRAyy5","UQECARmHtwmpU1X5Do8yyejs980");
	System.out.println(ac);
		
	}
	
}

2、编写将图片转化成base64后再转化成urlencode的工具类

如果 sun.misc.BASE64Encoder 找不到包,

右击工程,点击properties, 将已配置的Libraries  jre文件移除,再点击AddLibrary,选择jre system Library,加入jre,点击---next,最后finish 完成即可

可以看下这篇文章:https://blog.csdn.net/wang9258/article/details/17764985

package com.baidu;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import sun.misc.BASE64Encoder;

public class BaseImg64 {
	
	
	 /** * 将一张本地图片转化成Base64字符串 *
	  *  @param imgPath 本地图片地址 
	  *  * 
	  *  @return 图片转化base64后再UrlEncode结果 
	  *  */
	
	public static String getImageStrFromPath(String imgPath) { 
		InputStream in; 
		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编码过再URLEncode的字节数组字符串
		
		try {
			return URLEncoder.encode(encoder.encode(data),"UTF-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
   }
	
}

3、编写调用百度API接口的方法,获取识别结果

package com.baidu;

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.alibaba.fastjson.JSONObject;

public class BaiduOCR {
	 private static final String POST_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=accessToken";
	 
	 /** * 识别本地图片的文字 * * 
	  * @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 = BaseImg64.getImageStrFromPath(path); 
		String param = "image=" + image; 
		return generalBasic(param); 
	} 
	
	
	/** * @param url 图片url * 
	 * @return 识别结果,为json格式 
	 * */ 
	public static String checkUrl(String url) throws IOException, URISyntaxException { 
		String param = "url=" + url;
		return generalBasic(param); 
	} 
	
	    /** 
	     * 通用文字识别 
	     * 通过传递参数:url和image进行文字识别 * * 
	      @param param 区分是url还是image识别 *
	       @return 识别结果 * 
	       @throws URISyntaxException URI打开异常 * 
	       @throws IOException IO流异常
	        */ 
	private static String generalBasic(String param) throws URISyntaxException, IOException { 
		//开始搭建post请求
		HttpClient httpClient = HttpClientBuilder.create().build();
		HttpPost post = new HttpPost();
		String postUrl = POST_URL.replace("accessToken", "24.67ad73dcf15b5a38437d.2592000.1548398741.282335");
		URI url = new URI(postUrl); 
		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; 
	} 
	
	
	
	public static void main(String[] args) { 
		String path = "g:\\pic\\4.jpg"; 
		String result;
		try { 
			long now = System.currentTimeMillis(); 
		//	result = checkFile(path); 
			result = checkUrl("https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=08c05c0e8444ebf8797c6c6db890bc4f/fc1f4134970a304e46bfc5f7d2c8a786c9175c19.jpg"); 
			System.out.println(JSONObject.parse(result));
			System.out.println("耗时:" + (System.currentTimeMillis() - now) / 1000 + "s"); 
		} catch (URISyntaxException | IOException e) { 
			e.printStackTrace(); 
		} 
   }
	
	
}

百度的文档中心还有很多接口,写的很好。

Rf :  https://blog.csdn.net/wsk1103/article/details/79316220

猜你喜欢

转载自blog.csdn.net/qq_35893120/article/details/85264037
今日推荐