java百度ocr对行驶证进行识别

本文详细介绍如何使用百度OCR SDK及API实现行驶证信息的自动识别,包括SDK配置、图片Base64编码、网络请求调用及结果解析,适用于车辆信息自动化处理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baidu.aip.ocr.AipOcr;
import io.swagger.annotations.Api;
import okhttp3.Response;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.misc.BASE64Encoder;
import com.fasterxml.jackson.databind.ObjectMapper;


        <!--http://ai.baidu.com/sdk    调sdk,所需依赖-->
		<dependency>
			<groupId>com.baidu.aip</groupId>
			<artifactId>java-sdk</artifactId>
			<version>4.11.0</version>
		</dependency>





//设置APPID/AK/SK
    public static final String APP_ID = "******";//你的 App ID
    public static final String API_KEY = "*********";//你的 Api Key
    public static final String SECRET_KEY = "*******************";//你的 Secret Key

    public static void main(String[] args) {
        // 初始化一个AipOcr
        AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);

        // 调用接口
        sample(client);

    }

    /*================================================================= 调sdk 方法一:不需要获取accessToken  ===================================================================================*/
    /**
     * 通过调用百度的sdk实现识别  对行驶证进行识别   方法一:
     * @param client
     */
    public static  void sample(AipOcr client) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("detect_direction", "true");
        options.put("accuracy", "normal");
        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);
        // 参数为图片路径
          String image = "https://aip.bdstatic.com/portal/dist/1555683028116/ai_images/technology/ocr-cards/vehicle/demo-card-1.jpg";//行驶证照片路径
        byte[] base64 = imageBase64(image);
        org.json.JSONObject res= client.vehicleLicense(base64, options);//第三方接口  自动调用并返回值,自己不用写网络请求接口实现调用
        System.out.println(res);
        /*if(res.toString(2).contains("error_msg")){//没识别出来  返回不清晰/照片有误,重新上传
            System.out.println(1);
        }else{
            System.out.println(2);
        }*/
        try {
            Map map=new ObjectMapper().readValue(res.toString(),Map.class);
            Map words_result= (Map) map.get("words_result");
            String words= ((Map) words_result.get("车辆类型")).get("words")+"";
            String num= ((Map) words_result.get("号牌号码")).get("words")+"";
            System.out.println(words);
            System.out.println(num);
            if("轿车".contains(words) || "小型客车".contains(words)){//这几种车辆类型可以注册,其他不可以

            }else{

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }






 /**
     * 图片地址进行Base64编码
     * @param imgUrl
     * @return
     */
    private static String image2Base64(String imgUrl) {
        URL url = null;
        InputStream is = null;
        ByteArrayOutputStream outStream = null;
        HttpURLConnection httpUrl = null;
        try{
            url = new URL(imgUrl);
            httpUrl = (HttpURLConnection) url.openConnection();
            httpUrl.connect();
            httpUrl.getInputStream();
            is = httpUrl.getInputStream();
            outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串  
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕  
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来  
            while((len=is.read(buffer)) != -1 ){
            //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度  
            outStream.write(buffer, 0, len);
        }
            // 对字节数组Base64编码 
            //System.out.println("解压后大小kb:"+outStream.toByteArray().length/1024);
            return new BASE64Encoder().encode(outStream.toByteArray());
        }catch (Exception e){
            e.printStackTrace();
        }//下载
        finally{
        if(is !=null) {
            try{
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
            }
            }
            if(outStream != null) {
            try {
            outStream.close();
                } catch (IOException e) {
            e.printStackTrace();
                }
                }
            if(httpUrl != null) {
                httpUrl.disconnect();
            }
        }
        return imgUrl;
    }


    /**
     * 图片地址转为二进制数组
     * @param imgUrl
     * @return
     */
    private static byte[] imageBase64(String imgUrl) {
        URL url = null;
        InputStream is = null;
        ByteArrayOutputStream outStream = null;
        HttpURLConnection httpUrl = null;
        try{
            url = new URL(imgUrl);
            httpUrl = (HttpURLConnection) url.openConnection();
            httpUrl.connect();
            httpUrl.getInputStream();
            is = httpUrl.getInputStream();
            outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串  
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕  
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来  
            while((len=is.read(buffer)) != -1 ){
                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度  
                outStream.write(buffer, 0, len);
            }
            // 对字节数组Base64编码 
            //System.out.println("解压后大小kb:"+outStream.toByteArray().length/1024);
            return  outStream.toByteArray();
        }catch (Exception e){
            e.printStackTrace();
        }//下载
        finally{
            if(is !=null) {
                try{
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(outStream != null) {
                try {
                    outStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(httpUrl != null) {
                httpUrl.disconnect();
            }
        }
        return null;
    }
/*=================================================================  方法二:===============================================================================================*/

    /**
     *自己去调用url,进行百度识别  对行驶证进行识别  方法二:
     * 第一步:获取accessToken
     * 第二步:进行百度识别
     * @return
     */
    @PostMapping(value = "/getInfo")
    public void  getInfo(String accessToken){
    String url="https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license?";
       String urlPath= url+"access_token=" + accessToken;
        String imgUrl = "https://aip.bdstatic.com/portal/dist/1555683028116/ai_images/technology/ocr-cards/vehicle/demo-card-1.jpg";//行驶证照片路径
        String base64 = image2Base64(imgUrl);
        Map map=new HashMap();
      /*  map.put("image",URLEncoder.encode(base64));*/
        map.put("image",base64);//百度说 图像数据,base64编码后进行urlencode,此处不进行urlencode,
                                // 因为 Response response=new HttpClient().post_Form(urlPath,map);这一步对map中的值做了urlencode处理
       new Thread(){
            @Override
            public void run() {
                super.run();
                try {
                    Response response=new HttpClient().post_Form(urlPath,map);
                    String res =response.body().string();
                    //取值  方法一    转为JSONObject一层一层取值
                    JSONObject jb=JSON.parseObject(res);
                    String words_result=jb.getString("words_result");
                    JSONObject j=JSON.parseObject(words_result);
                    String p=j.getString("品牌型号");
                    String style=j.getString("车辆类型");
                    String user=j.getString("所有人");
                    String num=j.getString("号牌号码");

                    //取值  方法二   转为map,再去取值
                    Map map=new ObjectMapper().readValue(res,Map.class);
                    Map words= (Map) map.get("words_result");
                    String s=((Map)words.get("车辆类型")).get("words")+"";

                    if("轿车".contains(style) || "小型客车".contains(style)){//这几种车辆类型可以注册,其他不可以


                    }else{

                    }
                    System.out.println("品牌型号: "+p+" ,车辆类型: "+style+" ,所有人: "+user+" ,号牌号码:"+num);
                    System.out.println("====================="+res+"               "+response.isSuccessful());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
package com.xiao.api;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * @program: wash-car
 * @description:
 * @author: zl
 * @create: 2019-04-23 18:39
 **/

/**
 * 获取token类
 */
public class AuthService {

    /**
     * 获取权限token
     *
     * @return 返回示例:
     * {
     * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
     * "expires_in": 2592000
     * }
     */

    public static void main(String[] args) {
        getAuth();
    }
    public static String getAuth() {
        // 官网获取的 API Key 更新为你注册的
        String clientId = "F7Qwk*********";
        // 官网获取的 Secret Key 更新为你注册的
        String clientSecret = "9lvFqIlN***********";
       String access_token= getAuth(clientId, clientSecret);
       return access_token;
    }

    /**
     * 获取API访问token
     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.1个月有效期时间
     *
     * @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;
    }

}
package com.xiao.api;

/**
 * @program: wash-car
 * @description:
 * @author: zl
 * @create: 2019-04-23 19:28
 **/




import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import okhttp3.FormBody.Builder;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * okhttp和okio需要同时使用
 *
 * okhttp git https://github.com/square/okhttp
 * 依赖 implementation 'com.squareup.okhttp3:okhttp:3.10.0'
 *
 * okio git https://github.com/square/okio
 * 依赖 implementation 'com.squareup.okio:okio:1.14.1'
 */



public class HttpClient {
    private final OkHttpClient client;

    //设置默认字符编码  UTF-8 GBK 等...
    private final String POST_ENCODE_TYPE="UTF-8";
    private final String GET_ENCODE_TYPE="UTF-8";



    public HttpClient() {
        client = new OkHttpClient.Builder()
                // Set Timeout
                .connectTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                // Set Others
                .build();
    }




    private void toastMsg(Response response) {
    }

    private void toastMsg(String str) {
    }


    /**
     * 生成Request.Builder
     * 带有请求头参数
     */
    private Request.Builder createBuilder(String url,Map<String,String> addHeaderParameters,Map<String,String> setHeaderParameters){
        Request.Builder builder =new Request.Builder().url(url);
        if (addHeaderParameters!=null){//增加header参数
            Set<Entry<String, String>> entrys = addHeaderParameters.entrySet();
            for (Entry entry : entrys) {
                builder.addHeader(entry.getKey()+"",entry.getValue()+"");
            }
        }
        if (setHeaderParameters!=null){//定义header参数
            Set<Entry<String, String>> entrys = setHeaderParameters.entrySet();
            for (Entry entry : entrys) {
                builder.header(entry.getKey()+"",entry.getValue()+"");
            }
        }
        return builder;
    }


    /**
     * 生成Request.Builder,添加的默认的header参数,不同项目需要修改
     */
    private Request.Builder createBuilder(String url){
        Map mapSet=new HashMap();
        mapSet.put("Content-Type","application/x-www-form-urlencoded");
        return createBuilder(url,null,mapSet);
    }




    /**
     * Get请求,使用默认Header设置
     * @param url 请求地址
     * @param getParameters 携带参数
     */
    public Response get(String url,Map getParameters) throws Exception {
        if (getParameters!=null){
            Set<Entry> entrys = getParameters.entrySet();
            int i=0;
            for (Entry entry : entrys) {
                if (i==0){
                    url=url+"?"+entry.getKey()+"="+ formatStringGet(entry.getValue()+"");
                }else {
                    url=url+"&"+entry.getKey()+"="+ formatStringGet(entry.getValue()+"");
                }
                i++;
            }
        }
        Request request = createBuilder(url)
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            toastMsg(response);
            throw new IOException("Unexpected Code/响应失败" + response);
        }
        return response;
    }

    /**
     * Get请求,使用自定义Header设置
     * @param url 请求地址
     * @param getParameters 携带参数
     * @param addHeaderParameters 增加的请求头参数
     * @param setHeaderParameters 修改的请求头参数
     */
    public Response get(String url,Map getParameters,Map<String,String> addHeaderParameters,Map<String,String> setHeaderParameters) throws Exception {
        if (getParameters!=null){
            Set<Entry> entrys = getParameters.entrySet();
            int i=0;
            for (Entry entry : entrys) {
                if (i==0){
                    url=url+"?"+entry.getKey()+"="+ formatStringGet(entry.getValue()+"");
                }else {
                    url=url+"&"+entry.getKey()+"="+ formatStringGet(entry.getValue()+"");
                }
                i++;
            }
        }
        Request request = createBuilder(url,addHeaderParameters,setHeaderParameters)
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            toastMsg(response);
            throw new IOException("Unexpected Code/响应失败" + response);
        }
        return response;
    }








    /**
     * Post 提交字符串,使用默认Header设置
     * @param url
     * @param type
     * @param content
     * @return
     * @throws Exception
     */

    public Response post_String(String url,String type,String content) throws Exception {
        MediaType contentType=MediaType.parse(type);
        Request request = createBuilder(url)
                .post(RequestBody.create(contentType,content))
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            toastMsg(response);
            throw new IOException("Unexpected Code/响应失败" + response);
        }
        // response.code()+":"response.message()
        return response;
    }

    /**
     * Post 提交字符串,使用自定义Header设置
     * @param url
     * @param type
     * @param content
     * @param addHeaderParameters
     * @param setHeaderParameters
     * @return
     * @throws Exception
     */
    public Response post_String(String url,String type,String content,Map<String,String> addHeaderParameters,Map<String,String> setHeaderParameters) throws Exception {
        MediaType contentType=MediaType.parse(type);
        Request request = createBuilder(url,addHeaderParameters,setHeaderParameters)
                .post(RequestBody.create(contentType,content))
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            toastMsg(response);
            throw new IOException("Unexpected Code/响应失败" + response);
        }
        // response.code()+":"response.message()
        return response;
    }






    /**
     * Post 提交字表单,使用默认Header设置
     * @param url
     * @param formParameters
     * @return
     * @throws Exception
     */
    public Response post_Form(String url, Map formParameters) throws Exception {
        Builder builder = new Builder();
        Set<Entry> entrys = formParameters.entrySet();
        for (Entry entry : entrys) {
            builder.addEncoded(formatStringPost(entry.getKey()+""),formatStringPost(entry.getValue()+""));
        }
        RequestBody formBody = builder.build();
        Request request =createBuilder(url)
                .post(formBody)
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            toastMsg(response);
            throw new IOException("Unexpected Code/响应失败" + response);
        }
        return response;
    }

    /**
     *  Post 提交字表单,使用自定义Header设置
     * @param url
     * @param formParameters
     * @param addHeaderParameters
     * @param setHeaderParameters
     * @return
     * @throws Exception
     */
    public Response post_Form(String url, Map formParameters,Map<String,String> addHeaderParameters,Map<String,String> setHeaderParameters) throws Exception {
        Builder builder = new Builder();
        Set<Entry> entrys = formParameters.entrySet();
        for (Entry entry : entrys) {
            builder.addEncoded(formatStringPost(entry.getKey()+""),formatStringPost(entry.getValue()+""));
            if ((entry.getValue()+"").length()>1000){
            }else {
            }
        }
        RequestBody formBody = builder.build();

        Request request =createBuilder(url,addHeaderParameters,setHeaderParameters)
                .post(formBody)
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            toastMsg(response);
            throw new IOException("Unexpected Code/响应失败" + response);
        }
        return response;
    }



    private String formatStringGet(String content){
        String fs= "";
        try {
            fs = URLEncoder.encode(content,GET_ENCODE_TYPE);
        } catch (Exception e) {
            return content;
        }
        return fs;
    }



    private String formatStringPost(String content){
        String fs= "";
        try {
            fs = URLEncoder.encode(content,POST_ENCODE_TYPE);
        } catch (Exception e) {
            return content;
        }
        return fs;
    }
}

 /**
     * 高德地图通过经纬度获取省市县        通过OkHttpClient可以获取Response 
     * @param jingdu
     * @param weidu
     * @return
     */
    public  List<Object> gdapi(String jingdu, String weidu) {
       /* String url = "https://restapi.amap.com/v3/geocode/regeo?output=json&location=" +
                jingdu + "," + weidu + "&key=c6aa224a4ca7a96dbf665682cd92d5e0&radius=1000&extensions=base";*/
        String url = "https://restapi.amap.com/v3/geocode/regeo?output=json&location=" +
                jingdu + "," + weidu + "&key=8fb6d321b2e5ffdd496c45c4c819d37f&radius=1000&extensions=base";
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url(url).get().build();
        Call call = okHttpClient.newCall(request);
        List<Object> results=new ArrayList<>();
        try {
            Response response = call.execute();
            String result = response.body().string();
            JSONObject json = JSONArray.parseObject(result);
            log.info(json.toJSONString());
            JSONObject obj = JSONObject.parseObject(JSONObject.parseObject(json.get("regeocode").toString()).get("addressComponent").toString());
            log.info(obj.toJSONString());
            log.info("省"+obj.get("province").toString()+",市"+obj.get("city").toString()+",县"+obj.get("district").toString());
            results.add(obj.get("province"));
            results.add(obj.get("city"));
            results.add(obj.get("district"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return results;
    }

json转换字符串   参考:https://www.cnblogs.com/paisen/p/5487138.html

结:

1.调用第三方时,后台可以通过网络请求进行请求第三方接口,上面代码中有两种方式,一种是通过返回response这种方式获取返回来的值;一种是通过流进行获取。

2.如果是通过sdk的话,不用自己写网络请求进行调用,直接调用会返回值。

3.调用第三方返回的是String或者是jsonObject,都可以进行处理来获取值,有两种方法,上述例子都有代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stone.小小的太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值