zoukankan      html  css  js  c++  java
  • OCR识别

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

    腾讯云OCR

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

    身份证-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.前端ocr.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"> 正面       
        <input type="radio" name="card_side" value="BACK"> 反面
        <br />
        <input type="submit" value="提交">
        
      </form>
    
    3.后端代码

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

    @Controller
    @RequestMapping("/ocr")
    public class OcrController {
    
        @GetMapping("/index")
        public String index(){
            return "ocr";
        }
    
        @PostMapping("uploadFile")
        @ResponseBody
        public IDCardOCRResponse OCRIdCardTest(@RequestParam(value = "file") MultipartFile file, @RequestParam(value = "card_side") String cardSize, Model model){
            try {
                Credential cred = new Credential("AKIDfxxxx", "qSq9Fxxxxx");
    
                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);
    
                IDCardOCRRequest req = IDCardOCRRequest.fromJsonString(JSONObject.fromObject(params).toString(), IDCardOCRRequest.class);
                IDCardOCRResponse resp = client.IDCardOCR(req);
                return resp;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
    
        }
    //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 签名字段
         */
        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码,选择营业执照图片,点击提交就可以返回营业执照的信息了。

    百度云OCR

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

     

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

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

    身份证-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) {
          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) {
          e.printStackTrace();
        }
        return null;
      }

    多了解百度云和腾讯云官网,官网里面有很多api可以调用,有详细代码! 

    now ,fight for future
  • 相关阅读:
    CodeForces gym Nasta Rabbara lct
    bzoj 4025 二分图 lct
    CodeForces 785E Anton and Permutation
    bzoj 3669 魔法森林
    模板汇总——快读 fread
    bzoj2049 Cave 洞穴勘测 lct
    bzoj 2002 弹飞绵羊 lct裸题
    HDU 6394 Tree 分块 || lct
    HDU 6364 Ringland
    nyoj221_Tree_subsequent_traversal
  • 原文地址:https://www.cnblogs.com/wffzk/p/15655872.html
Copyright © 2011-2022 走看看