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
  • 相关阅读:
    codna的安装与使用
    ubuntu 下修改MySQL 的root用户密码
    python中的排序
    CF 543C Remembering Strings
    CF 1119C Ramesses and Corner Inversion
    HihoCoder 1384 Genius ACM
    BZOJ3032 七夕祭
    Vjudge Code
    CF51C Three Base Stations
    Sumdiv POJ 1845
  • 原文地址:https://www.cnblogs.com/wffzk/p/15655872.html
Copyright © 2011-2022 走看看