• 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
    如果喜欢作者的文章,请关注“写代码的猿”订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载
  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/lc-chenlong/p/10640607.html
Copyright © 2020-2023  润新知