• 身份证图片识别demo通过百度AI开放平台实现


    1、通过API文档方式实现
    1.1、接口描述
    支持对二代居民身份证正反面所有8个字段进行结构化识别,包括姓名、性别、民族、出生日期、住址、身份证号、签发机关、有效期限,识别准确率超过99%;同时支持身份证正面头像检测,并返回头像切片的base64编码及位置信息。
    同时,支持对用户上传的身份证图片进行图像风险和质量检测,可识别图片是否为复印件或临时身份证,是否被翻拍或编辑,是否存在正反颠倒、模糊、欠曝、过曝等质量问题。
    1.2、增值功能

    增值能力详情
    裁剪能力 头像检测与切片:返回头像切片的base64编码及位置信息
    质量检测 身份证图片模糊检测
    身份证关键字段反光或过曝光
    身份证图片较暗或欠曝光
    风险检测 身份证复印件告警
    临时身份证告警
    身份证翻拍告警
    身份证PS编辑告警
    身份证证号不合法告警
    身份证证号和姓名、出生日期、性别信息不一致告警


    1.3.1、请求说明

    HTTP 方法:POST

    请求URL: 

    https://aip.baidubce.com/rest/2.0/ocr/v1/idcard

    请求参数:

    URL参数

    参数
    access_token 通过API Key和Secret Key获取的access_token,参考“Access Token获取

    ②Header部分参数

    参数
    Content-Type application/x-www-form-urlencoded

     

    ③body部分参数

    参数是否必选类型可选值范围说明
    image 和url二选一 string - 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式
    url 和image二选一 string - 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式,当image字段存在时url字段失效
    请注意关闭URL防盗链
    id_card_side string front/back -front:身份证含照片的一面
    -back:身份证带国徽的一面
    自动检测身份证正反面,如果传参指定方向与图片相反,支持正常识别,返回参数image_status字段为"reversed_side"
    detect_direction string - 此参数新版本无需传,支持自动检测图像旋转角度
    detect_risk string true/false 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能,默认不开启,即:false。
    -true:开启,请查看返回参数risk_type;
    -false:不开启
    detect_photo string true/false 是否检测头像内容,默认不检测。可选值:true-检测头像并返回头像的 base64 编码及位置信息
    detect_rectify string - 此参数新版本无需传,支持自动校验图片完整性,可识别完整和切片身份证

    ④请求代码demo

    package com.baidu.ai.aip;
    
    import com.baidu.ai.aip.utils.Base64Util;
    import com.baidu.ai.aip.utils.FileUtil;
    import com.baidu.ai.aip.utils.HttpUtil;
    
    import java.net.URLEncoder;
    
    /**
    * 身份证识别
    */
    public class Idcard {
    
        /**
        * 重要提示代码中所需工具类
        * FileUtil,Base64Util,HttpUtil,GsonUtils请从
        * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
        * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
        * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
        * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
        * 下载
        */
        public static String idcard() {
            // 请求url
            String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
            try {
                // 本地文件路径
                String filePath = "[本地文件路径]";
                byte[] imgData = FileUtil.readFileByBytes(filePath);
                String imgStr = Base64Util.encode(imgData);
                String imgParam = URLEncoder.encode(imgStr, "UTF-8");
    
                String param = "id_card_side=" + "front" + "&image=" + imgParam;
    
                // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
                String accessToken = "[调用鉴权接口获取的token]";
    
                String result = HttpUtil.post(url, accessToken, param);
                System.out.println(result);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) {
            Idcard.idcard();
        }
    }

    ⑤返回参数说明

    字段是否必选类型说明
    direction int32 图像方向,当图像旋转时,返回该参数。
    - -1:未定义,
    - 0:正向,
    - 1: 逆时针90度,
    - 2:逆时针180度,
    - 3:逆时针270度
    image_status string normal-识别正常
    reversed_side-身份证正反面颠倒
    non_idcard-上传的图片中不包含身份证
    blurred-身份证模糊
    other_type_card-其他类型证照
    over_exposure-身份证关键字段反光或过曝
    over_dark-身份证欠曝(亮度过低)
    unknown-未知状态
    risk_type string 输入参数 detect_risk = true 时,则返回该字段识别身份证类型: normal-正常身份证;copy-复印件;temporary-临时身份证;screen-翻拍;unknown-其他未知情况
    edit_tool string 如果参数 detect_risk = true 时,则返回此字段。如果检测身份证被编辑过,该字段指定编辑软件名称,如:Adobe Photoshop CC 2014 (Macintosh),如果没有被编辑过则返回值无此参数
    log_id uint64 唯一的log id,用于问题定位
    photo string 当请求参数 detect_photo = true时返回,头像切图的 base64 编码(无编码头,需自行处理)
    photo_location array() 当请求参数 detect_photo = true时返回,头像的位置信息(坐标0点为左上角)
    idcard_number_type string 用于校验身份证号码、性别、出生是否一致,输出结果及其对应关系如下:
    -1: 身份证正面所有字段全为空
    0: 身份证证号不合法,此情况下不返回身份证证号
    1: 身份证证号和性别、出生信息一致
    2: 身份证证号和性别、出生信息都不一致
    3: 身份证证号和出生信息不一致
    4: 身份证证号和性别信息不一致
    words_result array() 定位和识别结果数组
    words_result_num uint32 识别结果数,表示words_result的元素个数
    +location array() 位置数组(坐标0点为左上角)
    ++left uint32 表示定位位置的长方形左上顶点的水平坐标
    ++top uint32 表示定位位置的长方形左上顶点的垂直坐标
    ++width uint32 表示定位位置的长方形的宽度
    ++height uint32 表示定位位置的长方形的高度
    +words string 识别结果字符串

    ⑥返回结果demo

    {
    	"words_result": {
    		"姓名": {
    			"words": "张三",
    			"location": {
    				"top": 447,
    				"left": 235,
    				"width": 135,
    				"height": 46
    			}
    		},
    		"民族": {
    			"words": "汉",
    			"location": {
    				"top": 529,
    				"left": 434,
    				"width": 28,
    				"height": 39
    			}
    		},
    		"住址": {
    			"words": "甘肃省甘谷县XXXXX",
    			"location": {
    				"top": 676,
    				"left": 235,
    				"width": 383,
    				"height": 88
    			}
    		},
    		"公民身份号码": {
    			"words": "6205XXXXXXXXXXXXXXX",
    			"location": {
    				"top": 860,
    				"left": 382,
    				"width": 503,
    				"height": 48
    			}
    		},
    		"出生": {
    			"words": "199XXXX",
    			"location": {
    				"top": 600,
    				"left": 232,
    				"width": 309,
    				"height": 39
    			}
    		},
    		"性别": {
    			"words": "男",
    			"location": {
    				"top": 527,
    				"left": 235,
    				"width": 33,
    				"height": 41
    			}
    		}
    	},
    	"log_id": 1362745221229576598,
    	"words_result_num": 6,
    	"idcard_number_type": 1,
    	"image_status": "normal"
    }
    

    1.3.2、请求代码

    ①代码结构

    ②需要下载的几个工具类

    FileUtil,Base64Util,HttpUtil,GsonUtils
    https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3  

    ③需要导入的包

        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.7</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.json</groupId>
                <artifactId>json</artifactId>
                <version>20160810</version>
            </dependency>
        </dependencies> 

    ④主方法class

    package com.baidu.ai.aip;
    
    import com.baidu.ai.aip.utils.Base64Util;
    import com.baidu.ai.aip.utils.FileUtil;
    import com.baidu.ai.aip.utils.HttpUtil;
    
    import java.net.URLEncoder;
    
    /**
    * 身份证识别
    */
    public class Idcard {
    
        /**
        * 重要提示代码中所需工具类
        * FileUtil,Base64Util,HttpUtil,GsonUtils请从
        * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
        * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
        * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
        * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
        * 下载
        */
        public static String idcard() {
            // 请求url
            String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
            try {
                // 本地文件路径
                String filePath = "[本地文件路径]";
                byte[] imgData = FileUtil.readFileByBytes(filePath);
                String imgStr = Base64Util.encode(imgData);
                String imgParam = URLEncoder.encode(imgStr, "UTF-8");
    
                String param = "id_card_side=" + "front" + "&image=" + imgParam;
    
                // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
                String accessToken = "[调用鉴权接口获取的token]";
    
                String result = HttpUtil.post(url, accessToken, param);
                System.out.println(result);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) {
            Idcard.idcard();
        }
    }
    

      图片路径、front/back为身份证的正反面,token的获取需要在别的一个工具类中获取AuthService中获取,调用AuthService中的

    getAuth返回token

    ⑤AuthService类

    package com.baidu.ai.aip.auth;
    
    import org.json.JSONObject;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 获取token类
     */
    public class AuthService {
    
        /**
         * 获取权限token
         * @return 返回示例:
         * {
         * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
         * "expires_in": 2592000
         * }
         */
        public static String getAuth() {
            // 官网获取的 API Key 更新为你注册的
            String clientId = "百度云应用的AK";
            // 官网获取的 Secret Key 更新为你注册的
            String clientSecret = "百度云应用的SK";
            return getAuth(clientId, clientSecret);
        }
    
        /**
         * 获取API访问token
         * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
         * @param ak - 百度云官网获取的 API Key
         * @param sk - 百度云官网获取的 Securet Key
         * @return assess_token 示例:
         * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
         */
        public static String getAuth(String ak, String sk) {
            // 获取token地址
            String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
            String getAccessTokenUrl = authHost
                    // 1. grant_type为固定参数
                    + "grant_type=client_credentials"
                    // 2. 官网获取的 API Key
                    + "&client_id=" + ak
                    // 3. 官网获取的 Secret Key
                    + "&client_secret=" + sk;
            try {
                URL realUrl = new URL(getAccessTokenUrl);
                // 打开和URL之间的连接
                HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
                connection.setRequestMethod("GET");
                connection.connect();
                // 获取所有响应头字段
                Map<String, List<String>> map = connection.getHeaderFields();
                // 遍历所有的响应头字段
                for (String key : map.keySet()) {
                    System.err.println(key + "--->" + map.get(key));
                }
                // 定义 BufferedReader输入流来读取URL的响应
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String result = "";
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
                /**
                 * 返回结果示例
                 */
                System.err.println("result:" + result);
                JSONObject jsonObject = new JSONObject(result);
                String access_token = jsonObject.getString("access_token");
                return access_token;
            } catch (Exception e) {
                System.err.printf("获取token失败!");
                e.printStackTrace(System.err);
            }
            return null;
        }
    
    }
    AK和SK在百度AI开放平台中  文字识别--应用列表--创建应用  就可以看得到

    ⑥demo

    链接:https://pan.baidu.com/s/13n7_SPaQLfSsK-uDhS3CBw 
    提取码:vs9g 
    (个人 Api Key、Secret Key,仅供方便参考着使用,请勿用于其他用途

    2、通过SDK文档方式实现

     2.1、OCR Java SDK目录结构

    com.baidu.aip
           ├── auth                                //签名相关类
           ├── http                                //Http通信相关类
           ├── client                              //公用类
           ├── exception                           //exception类
           ├── ocr
           │       └── AipOcr           //AipOcr类
           └── util                                //工具类

    2.2、依赖的包

    <dependency>
        <groupId>com.baidu.aip</groupId>
        <artifactId>java-sdk</artifactId>
        <version>${version}</version>
    </dependency>
    

    2.3、测试demo

    public class Sample {
        //设置APPID/AK/SK
        public static final String APP_ID = "你的 App ID";
        public static final String API_KEY = "你的 Api Key";
        public static final String SECRET_KEY = "你的 Secret Key";
    
        public static void main(String[] args) {
            // 初始化一个AipOcr
            AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
    
            // 可选:设置网络连接参数
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
    
            // 可选:设置代理服务器地址, http和socket二选一,或者均不设置
            client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
            client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理
    
            // 可选:设置log4j日志输出格式,若不设置,则使用默认配置
            // 也可以直接通过jvm启动参数设置此环境变量
            System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
    
            // 调用接口
            String path = "test.jpg";
            JSONObject res = client.basicGeneral(path, new HashMap<String, String>());
            System.out.println(res.toString(2));
        }
    }
    

      这几个参数在百度AI开放平台直接复制即可

    2.4、测试代码

    链接:https://pan.baidu.com/s/1iYy4MIDEWel2w6yG5Dhq7g 
    提取码:0e7e 
    (个人 App ID、Api Key、Secret Key,仅供方便参考着使用,请勿用于其他用途

    后期完善参数信息

  • 相关阅读:
    工作流调度器azkaban
    日志采集框架Flume
    MAPREDUCE框架结构及核心运行机制
    Python爬虫开发系列之五》数据存储为TXT、JSON格式
    Python爬虫开发系列之二》请求库及解析库安装
    策略模式+简单工厂模式
    简单工厂模式
    单例模式
    5、计算高可用
    4、存储高可用
  • 原文地址:https://www.cnblogs.com/torchstar/p/14418390.html
Copyright © 2020-2023  润新知