最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)百度云OCR文字識(shí)別 高精度OCR識(shí)別身份證信息

 更新時(shí)間:2018年11月26日 16:49:44   作者:tobe27  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)百度云OCR文字識(shí)別,高精度OCR識(shí)別身份證信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文為大家分享了java實(shí)現(xiàn)百度云OCR識(shí)別的具體代碼,高精度OCR識(shí)別身份證信息,供大家參考,具體內(nèi)容如下

1.通用OCR文字識(shí)別

這種OCR只能按照識(shí)別圖片中的文字,且是按照行識(shí)別返回結(jié)果,精度較低。

首先引入依賴(lài)包:

<dependency>
  <groupId>com.baidu.aip</groupId>
  <artifactId>java-sdk</artifactId>
  <version>4.6.0</version>
</dependency>

通過(guò)OCR工具類(lèi):

package util;
 
import com.baidu.aip.ocr.AipOcr;
import org.json.JSONObject;
import java.util.HashMap;
 
 
public class OcrApi {
  private static final String APP_ID = "你的 App ID";
  private static final String API_KEY = "Xb12m5t4jS2n7";
  private static final String SECRET_KEY = "9XVx9GPcSbSUTZ";
 
  private static AipOcr getAipClient() {
    return getAipClient(API_KEY, SECRET_KEY);
  }
 
  public static AipOcr getAipClient(String apiKey, String secretKey) {
    AipOcr client = new AipOcr(APP_ID, apiKey, secretKey);
    // 可選:設(shè)置網(wǎng)絡(luò)連接參數(shù)
    client.setConnectionTimeoutInMillis(2000);
    client.setSocketTimeoutInMillis(60000);
    return client;
  }
 
  public static String result(AipOcr client) {
    // 傳入可選參數(shù)調(diào)用接口
    HashMap<String, String> options = new HashMap<>();
    options.put("language_type", "CHN_ENG");
    options.put("detect_direction", "true");
    options.put("detect_language", "true");
    options.put("probability", "true");
 
    JSONObject res = client.basicGeneralUrl(
        "https://lichunyu1234.oss-cn-shanghai.aliyuncs.com/1.png", options);
    return res.toString(2);
  }
 
  public static void main(String[] args) {
    System.out.println(result(getAipClient()));
  }
}

結(jié)果如下,識(shí)別有兩行信息(words即是識(shí)別的信息):

2.高精度OCR識(shí)別身份證信息 

這種就比較高精度,且按照分類(lèi)顯示,返回?cái)?shù)據(jù)更友好,高可用。

2.1 接口說(shuō)明及請(qǐng)求參數(shù)是地址官方截圖如下:

2.2 OCR身份證識(shí)別工具類(lèi)

package util;
 
import com.alibaba.druid.util.Base64;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
 
public class OcrUtil {
  // Access_Token獲取
  private static final String ACCESS_TOKEN_HOST = "https://aip.baidubce.com/oauth/2.0/token?";
  // 身份證識(shí)別請(qǐng)求URL
  private static final String OCR_HOST = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?";
  // apiKey,secretKey
  private static final String API_KEY ="Xb12m5t4jS";
  private static final String SECRET_KEY = "9XVx9GPcSbSUT";
 
 
  // 獲取百度云OCR的授權(quán)access_token
  public static String getAccessToken() {
    return getAccessToken(API_KEY, SECRET_KEY);
  }
 
  /**
   * 獲取百度云OCR的授權(quán)access_token
   * @param apiKey
   * @param secretKey
   * @return
   */
  public static String getAccessToken(String apiKey, String secretKey) {
    String accessTokenURL = ACCESS_TOKEN_HOST
        // 1. grant_type為固定參數(shù)
        + "grant_type=client_credentials"
        // 2. 官網(wǎng)獲取的 API Key
        + "&client_id=" + apiKey
        // 3. 官網(wǎng)獲取的 Secret Key
        + "&client_secret=" + secretKey;
 
    try {
      URL url = new URL(accessTokenURL);
      // 打開(kāi)和URL之間的連接
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setRequestMethod("GET");
      connection.connect();
 
      // 獲取響應(yīng)頭
      Map<String, List<String>> map = connection.getHeaderFields();
      // 遍歷所有的響應(yīng)頭字段
      for (String key : map.keySet()) {
        System.out.println(key + "---->" + map.get(key));
      }
 
      // 定義 BufferedReader輸入流來(lái)讀取URL的響應(yīng)
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
      StringBuilder result = new StringBuilder();
      String inputLine;
      while ((inputLine = bufferedReader.readLine()) != null) {
        result.append(inputLine);
      }
      JSONObject jsonObject = JSONObject.parseObject(result.toString());
      return jsonObject.getString("access_token");
 
    } catch (Exception e) {
      e.printStackTrace();
      System.err.print("獲取access_token失敗");
    }
    return null;
  }
 
  /**
   * 獲取身份證識(shí)別后的數(shù)據(jù)
   * @param imageUrl
   * @param idCardSide
   * @return
   */
  public static String getStringIdentityCard(File imageUrl, String idCardSide) {
    // 身份證OCR的http URL+鑒權(quán)token
    String OCRUrl = OCR_HOST+"access_token="+getAccessToken();
    System.out.println(OCRUrl);
    System.out.println("***************************************************");
    System.out.println(getAccessToken());
    // 對(duì)圖片進(jìn)行base64處理
    String image = encodeImageToBase64(imageUrl);
    // 請(qǐng)求參數(shù)
    String requestParam = "detect_direction=true&id_card_side="+idCardSide+"&image="+image;
 
    try {
      // 請(qǐng)求OCR地址
      URL url = new URL(OCRUrl);
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      // 設(shè)置請(qǐng)求方法為POST
      connection.setRequestMethod("POST");
 
      // 設(shè)置請(qǐng)求頭
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      connection.setRequestProperty("apiKey", API_KEY);
      connection.setDoOutput(true);
      connection.getOutputStream().write(requestParam.getBytes(StandardCharsets.UTF_8));
      connection.connect();
 
      // 定義 BufferedReader輸入流來(lái)讀取URL的響應(yīng)
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
      StringBuilder result = new StringBuilder();
      String inputLine;
      while ((inputLine = bufferedReader.readLine()) != null) {
        result.append(inputLine);
      }
      bufferedReader.close();
      return result.toString();
    } catch (Exception e) {
      e.printStackTrace();
      System.err.println("身份證OCR識(shí)別異常");
      return null;
    }
  }
 
  /**
   * 對(duì)圖片url進(jìn)行Base64編碼處理
   * @param imageUrl
   * @return
   */
  public static String encodeImageToBase64(File imageUrl) {
    // 將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對(duì)其進(jìn)行Base64編碼處理
    byte[] data = null;
    try {
      InputStream inputStream = new FileInputStream(imageUrl);
      data = new byte[inputStream.available()];
      inputStream.read(data);
      inputStream.close();
 
      // 對(duì)字節(jié)數(shù)組Base64編碼
      return URLEncoder.encode(Base64.byteArrayToBase64(data), "UTF-8");
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
 
  }
 
  /**
   * 提取OCR識(shí)別身份證有效信息
   * @param
   * @return
   */
  public static Map<String, String> getIdCardInfo(MultipartFile image, int idCardSide) {
    String value = getStringIdentityCard(image, idCardSide);
    String side;
    if (idCardSide == 1) {
      side = "正面";
    }else {
      side = "背面";
    }
    Map<String, String> map = new HashMap<>();
    JSONObject jsonObject = JSONObject.parseObject(value);
    JSONObject words_result = jsonObject.getJSONObject("words_result");
    if (words_result == null || words_result.isEmpty()) {
      throw new MyException("請(qǐng)?zhí)峁┥矸葑C"+side+"圖片");
    }
    for (String key : words_result.keySet()) {
      JSONObject result = words_result.getJSONObject(key);
      String info = result.getString("words");
      switch (key) {
        case "姓名":
          map.put("name", info);
          break;
        case "性別":
          map.put("sex", info);
          break;
        case "民族":
          map.put("nation", info);
          break;
        case "出生":
          map.put("birthday", info);
          break;
        case "住址":
          map.put("address", info);
          break;
        case "公民身份號(hào)碼":
          map.put("idNumber", info);
          break;
        case "簽發(fā)機(jī)關(guān)":
          map.put("issuedOrganization", info);
          break;
        case "簽發(fā)日期":
          map.put("issuedAt", info);
          break;
        case "失效日期":
          map.put("expiredAt", info);
          break;
      }
    }
    return map;
 
  }
 
}

官方返回示例:

對(duì)于身份證識(shí)別有個(gè)大坑:

1.有的base64編碼后有頭部“Base64:”要去掉,阿里巴巴的base64可以正常使用。

2.OCR識(shí)別官方只說(shuō)明圖片要Base64編碼,但是實(shí)際上還是要再UrlEncode再編碼一次才可以。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解JavaWeb中的過(guò)濾器Filter

    詳解JavaWeb中的過(guò)濾器Filter

    今天給大家講一下JavaWeb中的過(guò)濾器Filter,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java解析pdf格式發(fā)票的代碼實(shí)現(xiàn)

    Java解析pdf格式發(fā)票的代碼實(shí)現(xiàn)

    為了減少用戶(hù)工作量及誤操作的可能性,需要實(shí)現(xiàn)用戶(hù)上傳PDF格式的發(fā)票,系統(tǒng)通過(guò)解析PDF文件獲取發(fā)票內(nèi)容,并直接將其寫(xiě)入表單,以下文章記錄了功能實(shí)現(xiàn)的代碼,需要的朋友可以參考下
    2024-08-08
  • 詳解Java拋出和聲明異常的代碼實(shí)現(xiàn)

    詳解Java拋出和聲明異常的代碼實(shí)現(xiàn)

    我們?cè)诰帉?xiě)代碼時(shí),有時(shí)候因?yàn)槟承┰?并不想在這個(gè)方法中立即處理產(chǎn)生的異常,也就是說(shuō)并不想進(jìn)行異常的捕獲,接下來(lái)小編就來(lái)教會(huì)大家該如何進(jìn)行異常的拋出,需要的朋友可以參考下
    2023-08-08
  • JDK與Dubbo中的SPI詳細(xì)介紹

    JDK與Dubbo中的SPI詳細(xì)介紹

    這篇文章主要介紹了JDK中的SPI與Dubbo中的SPI,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • SpringMvc靜態(tài)資源訪(fǎng)問(wèn)實(shí)現(xiàn)方法代碼實(shí)例

    SpringMvc靜態(tài)資源訪(fǎng)問(wèn)實(shí)現(xiàn)方法代碼實(shí)例

    這篇文章主要介紹了SpringMvc靜態(tài)資源訪(fǎng)問(wèn)實(shí)現(xiàn)方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Elasticsearch寫(xiě)入瓶頸導(dǎo)致skywalking大盤(pán)空白

    Elasticsearch寫(xiě)入瓶頸導(dǎo)致skywalking大盤(pán)空白

    這篇文章主要為大家介紹了Elasticsearch寫(xiě)入瓶頸導(dǎo)致skywalking大盤(pán)空白的解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • Java排序算法中的選擇排序算法實(shí)現(xiàn)

    Java排序算法中的選擇排序算法實(shí)現(xiàn)

    這篇文章主要介紹了Java排序算法中的選擇排序算法實(shí)現(xiàn),選擇排序算法的實(shí)現(xiàn)思路類(lèi)似插入排序,分已排序區(qū)間和未排序區(qū)間,選擇排序每次會(huì)從未排序區(qū)間中找到最小(大)的元素,將其放到已排序區(qū)間的末尾,需要的朋友可以參考下
    2023-12-12
  • java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng)

    java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • SpringMVC配置404踩坑記錄

    SpringMVC配置404踩坑記錄

    本文主要介紹了SpringMVC配置404踩坑記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • MyBatis Mapper代理使用方法詳解

    MyBatis Mapper代理使用方法詳解

    本文是小編日常收集整理的關(guān)于mybatis mapper代理使用方法知識(shí),通過(guò)本文還給大家提供有關(guān)開(kāi)發(fā)規(guī)范方面的知識(shí)點(diǎn),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-08-08

最新評(píng)論

盱眙县| 惠安县| 嵊泗县| 广西| 丽江市| 扶绥县| 河北省| 教育| 天水市| 大庆市| 杭州市| 上饶市| 温泉县| 宁津县| 惠东县| 二连浩特市| 临安市| 民县| 慈溪市| 五原县| 三原县| 罗甸县| 青州市| 赞皇县| 武义县| 城固县| 来凤县| 长治市| 甘孜县| 汝阳县| 公主岭市| 姚安县| 项城市| 神池县| 兴隆县| 剑河县| 祥云县| 石台县| 陆河县| 卢龙县| 曲阳县|