OCR识别

释放双眼,带上耳机,听听看~!

最近作者项目中用到了身份证识别跟营业执照的OCR识别,就研究了一下百度云跟腾讯云的OCR产品接口。

1.腾讯云OCR

 

收费:身份证OCR和营业执照OCR接口,每个接口每个月各有1000次的免费调用

接口说明:

  1. 身份证OCR接口

    https://cloud.tencent.com/document/product/866/33524

  2. 营业执照OCR接口-

    https://cloud.tencent.com/document/product/866/17598

     

身份证-OCR接入

  1. 引入腾讯的SDK及JSON

<dependency>
        <groupId>com.tencentcloudapi</groupId>
        <artifactId>tencentcloud-sdk-java</artifactId>
        <version>3.0.58</version>
    </dependency>     
    <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

  2.前端html代码

<form action=\"/ocr/uploadFile\" method=\"POST\" enctype=\"multipart/form-data\">
    <input type=\"file\" name=\"file\">
    <br />
    <input type=\"radio\" name=\"card_side\" value=\"FRONT\"> 正面 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input type=\"radio\" name=\"card_side\" value=\"BACK\"> 反面
    <br />
    <input type=\"submit\" value=\"提交\">
    
  </form>

  3.后端代码

@PostMapping(\"uploadFile\")
  @ResponseBody
  public IDCardOCRResponse OCRIdCardTest(@RequestParam(value = \"file\") MultipartFile file,@RequestParam(value = \"card_side\") String cardSize,Model model){
    try {
      Credential cred = new Credential(\"AKIDGQfhYTqEs0DMvUQH93wXKsIX\", \"7adThzEEH6mK6zg9MMwX0\");
          
          HttpProfile httpProfile = new HttpProfile();
          httpProfile.setEndpoint(\"ocr.tencentcloudapi.com\");

          ClientProfile clientProfile = new ClientProfile();
          clientProfile.setHttpProfile(httpProfile);            
          
          OcrClient client = new OcrClient(cred, \"ap-beijing\", clientProfile);
          Map<String, String> params = new HashMap<>();
          params.put(\"ImageBase64\", getBase64FromInputStream(file.getInputStream()));
          params.put(\"CardSide\", cardSize);

          System.out.println(getBase64FromInputStream(file.getInputStream()));
          IDCardOCRRequest req = IDCardOCRRequest.fromJsonString(JSONObject.fromObject(params).toString(), IDCardOCRRequest.class);
          IDCardOCRResponse resp = client.IDCardOCR(req);
          return resp;
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
    return null;
    
  }

说明:new Credential(\"secretId\",\"secretKey\"),这两个参数在腾讯云控制台申请

  4.getBase64FromInputStream代码,把MultipartFile 转为base64

public static String getBase64FromInputStream(InputStream in) {
          // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
          byte[] data = null;
          // 读取图片字节数组
          try {
              ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
              byte[] buff = new byte[100];
              int rc = 0;
              while ((rc = in.read(buff, 0, 100)) > 0) {
                  swapStream.write(buff, 0, rc);
              }
              data = swapStream.toByteArray();
          } catch (IOException e) {
              e.printStackTrace();
          } finally {
              if (in != null) {
                  try {
                      in.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
          return new String(Base64.encodeBase64(data));
      }

 

运行前端html码,选择身份证图片,点击提交就可以返回身份证的信息了。

营业执照-OCR

1.前端html代码

<form action=\"/ocr/bizlicense\" method=\"POST\" enctype=\"multipart/form-data\">
    <input type=\"file\" name=\"file\">
    <br />
    
    <input type=\"submit\" value=\"提交\">
    
  </form>

 

2.后端代码

@PostMapping(\"bizlicense\")
  @ResponseBody
  public String OCRBizlicenseTest(@RequestParam(value = \"file\") MultipartFile file) throws Exception{
      RestTemplate restTemplate = new RestTemplate();
    String apiUrl=\"https://recognition.image.myqcloud.com/ocr/bizlicense\";
    HttpHeaders headers = new HttpHeaders();
        headers.set(\"host\", \"recognition.image.myqcloud.com\");
        headers.set(\"content-type\", \"application/json\");
        String authorization=QQOCRSignUtils.appSign(XXXX, \"AKIDGQfhYTqEs0DXXX\", \"7adThzEEH6mKXXX\", \"\", 10L);
        headers.set(\"authorization\",authorization );
       
        JSONObject params = new JSONObject();
        params.put(\"appid\", \"XXX\");
        params.put(\"image\", getBase64FromInputStream(file.getInputStream()));
        HttpEntity<JSONObject> entity = new HttpEntity<JSONObject>(params, headers);
        HttpEntity<String> response  = restTemplate.postForEntity(apiUrl, entity, String.class);
        return response.getBody();
  }

 

3.QQOCRSignUtils.appSign

/**
     * 生成 Authorization 签名字段
     * 
     * @param appId
     * @param secretId
     * @param secretKey
     * @param bucketName
     * @param expired
     * @return
     * @throws Exception
     */
    public static String appSign(long appId, String secretId, String secretKey, String bucketName,
            long expired) throws Exception {
        long now = System.currentTimeMillis() / 1000;
        int rdm = Math.abs(new Random().nextInt());
        String plainText = String.format(\"a=%d&b=%s&k=%s&t=%d&e=%d&r=%d\", appId, bucketName,
                secretId, now, now + expired, rdm);
        byte[] hmacDigest = HmacSha1(plainText, secretKey);
        byte[] signContent = new byte[hmacDigest.length + plainText.getBytes().length];
        System.arraycopy(hmacDigest, 0, signContent, 0, hmacDigest.length);
        System.arraycopy(plainText.getBytes(), 0, signContent, hmacDigest.length,
                plainText.getBytes().length);
        return Base64Encode(signContent);
    }

运行前端html码,选择营业执照图片,点击提交就可以返回营业执照的信息了。

2.百度OCR

通过以下步骤创建OCR应用,作者当时在这一步花了很长时间

 

 

创建完之后就可以拿到appId,API Key,Secret Key,就可以调用百度提供的api了

收费:身份证OCR和营业执照OCR接口,每个接口每天各有500次的免费调用

接口说明:

  1. 身份证OCR接口

    https://cloud.baidu.com/doc/OCR/OCR-API.html#.E8.BA.AB.E4.BB.BD.E8.AF.81.E8.AF.86.E5.88.AB

  2. 营业执照OCR接口-

    https://cloud.baidu.com/doc/OCR/OCR-API.html#.E8.90.A5.E4.B8.9A.E6.89.A7.E7.85.A7.E8.AF.86.E5.88.AB

 

身份证OCR 

只列出后端的代码,前端代码跟腾讯的一样,只不过前后面身份证枚举值不一样,参考接口文档说明。

@PostMapping(\"ocridcard\")
  @ResponseBody
  public String OCRIdCardTest(@RequestParam(value = \"file\") MultipartFile file,@RequestParam(value = \"card_side\") String cardSize,Model model){
    try {
      RestTemplate restTemplate = new RestTemplate();
      HttpEntity<String> response =  restTemplate.postForEntity(\"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=XXXXXX&client_secret=XXXXXX\",null,String.class);
      JSONObject jsonObject = JSONObject.fromObject(response.getBody());
      System.out.println(response.getBody());
      String accessToken = jsonObject.getString(\"access_token\");
      
      String apiUrl=\"https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=\"+accessToken;
      HttpHeaders headers = new HttpHeaders();
          headers.set(\"content-type\", \"application/x-www-form-urlencoded\");
          
          MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
          params.add(\"detect_direction\", \"true\");
          params.add(\"id_card_side\", cardSize);
          params.add(\"image\", Base64Utils.getBase64FromInputStream(file.getInputStream()));
          params.add(\"detect_risk\", \"true\");
          System.out.println(Base64Utils.getBase64FromInputStream(file.getInputStream()));
          System.out.println(URLDecoder.decode(URLEncoder.encode(Base64Utils.getBase64FromInputStream(file.getInputStream()),\"UTF-8\"),\"UTF-8\"));
          HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(params, headers);
          response  = restTemplate.postForEntity(apiUrl, entity, String.class);
          return response.getBody();
          
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
    return null;
    
  }

营业执照OCR

@PostMapping(\"ocrbusinesslicense\")
  @ResponseBody
  public String OCRBusinessLicenseTest(@RequestParam(value = \"file\") MultipartFile file,Model model){
    try {
      RestTemplate restTemplate = new RestTemplate();
      HttpEntity<String> response =  restTemplate.postForEntity(\"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=XXXXX&client_secret=XXXXXX\",null,String.class);
      JSONObject jsonObject = JSONObject.fromObject(response.getBody());
      System.out.println(response.getBody());
      String accessToken = jsonObject.getString(\"access_token\");
      
      String apiUrl=\"https://aip.baidubce.com/rest/2.0/ocr/v1/business_license?access_token=\"+accessToken;
      HttpHeaders headers = new HttpHeaders();
          headers.set(\"content-type\", \"application/x-www-form-urlencoded\");
          
          MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
          params.add(\"detect_direction\", \"true\");
          params.add(\"image\", Base64Utils.getBase64FromInputStream(file.getInputStream()));
     
          System.out.println(Base64Utils.getBase64FromInputStream(file.getInputStream()));
          System.out.println(URLDecoder.decode(URLEncoder.encode(Base64Utils.getBase64FromInputStream(file.getInputStream()),\"UTF-8\"),\"UTF-8\"));
          HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(params, headers);
          response  = restTemplate.postForEntity(apiUrl, entity, String.class);
          return response.getBody();
          
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
    return null;
    
  }

 

作者:
Eric.Chen

出处:
https://www.cnblogs.com/lc-chenlong

如果喜欢作者的文章,请关注“写代码的猿”订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载


 

人已赞赏
随笔日记

传统企业就应该这样进行微服务化

2020-11-9 4:08:43

随笔日记

在angular7中创建组件/自定义指令/管道

2020-11-9 4:08:45

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索