zoukankan      html  css  js  c++  java
  • 印刷文字识别-身份证识别(阿里云)

    以下是自己根据阿里云api文档说明封装的工具类,主要是获取阿里云Oss身份证图片信息

    阿里云api文档URL:https://market.aliyun.com/products/57124001/cmapi010401.html?spm=a2c4g.11186623.2.7.VojbRu

    <?php
    
    namespace Helper;
    
    use orgResponse;
    use thinkController;
    use thinkRequest;
    use thinkDb;
    use thinkLoader;
    
    /**
     * 身份证识别
     * Class AutoRecognition
     * @package Helper
     * @author fgf <2018-06-07>
     */
    class AutoRecognition
    {
        /**
         * 读取远程图片的二进制流
         * @param string $url 远程图片URL地址
         * @return bool|string
         */
        public static function httpDownload($url=''){
            if(empty($url)){
                return false;
            }
            ob_start();
            $contents = @readfile($url);
            $img = ob_get_contents();
            ob_end_clean();
            return $img;
        }
    
        /**
         * 身份证正面识别
         * $file 你的文件路径
         * $param $appcode 阿里云APPCODE
         * @return array
         */
        public static function face($file='')
        {
            if (empty($file)) {
                return Response::response(1,'图片为空');
            }
            //请求阿里云api地址
            $url = "https://dm-51.data.aliyun.com/rest/160601/ocr/ocr_idcard.json";
            $appcode = config('APPCODE');//读取配置文件阿里云APPCODE
            //你的文件路径
            //$file = "你的文件路径";
            //如果输入带有inputs, 设置为True,否则设为False
            $is_old_format = false;
            //如果没有configure字段,config设为空
            $config = array(
                "side" => "face"//身份证正反面类型:face/back
            );
            //$config = array()
            //打开文件
            if($fp = @fopen($file, "rb", 0)) {
                //$binary = fread($fp, filesize($file)); // 文件读取-filesize无法获取远程文件的大小,只能读取path路径文件
                $binary = self::httpDownload($file); // 文件读取-读取远程图片的二进制流
                fclose($fp);
                $base64 = base64_encode($binary); // 转码
            }else{
                return Response::response(1,'图片打开失败,请检查图片路径是否正确');
            }
            $headers = array();
            array_push($headers, "Authorization:APPCODE " . $appcode);
            //根据API的要求,定义相对应的Content-Type
            array_push($headers, "Content-Type".":"."application/json; charset=UTF-8");
            $querys = "";
            if($is_old_format == TRUE){
                $request = array();
                $request["image"] = array(
                    "dataType" => 50,
                    "dataValue" => "$base64"
                );
    
                if(count($config) > 0){
                    $request["configure"] = array(
                        "dataType" => 50,
                        "dataValue" => json_encode($config)
                    );
                }
                $body = json_encode(array("inputs" => array($request)));
            }else{
                $request = array(
                    "image" => "$base64"
                );
                if(count($config) > 0){
                    $request["configure"] = json_encode($config);
                }
                $body = json_encode($request);
            }
            $method = "POST";
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_FAILONERROR, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HEADER, true);
            if (1 == strpos("$".$url, "https://"))
            {
                curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
            }
            curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
            $result = curl_exec($curl);
            $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
            $rheader = substr($result, 0, $header_size);
            $rbody = substr($result, $header_size);
    
            $httpCode = curl_getinfo($curl,CURLINFO_HTTP_CODE);
            if($httpCode == 200){
                if($is_old_format){
                    $output = json_decode($rbody, true);
                    $result_str = $output["outputs"][0]["outputValue"]["dataValue"];
                }else{
                    $result_str = $rbody;
                }
                //printf("result is :
     %s
    ", $result_str);//这是阿里原生的结果打印
                //身份证读取内容输出
                return Response::response(0, json_decode($result_str));
            }else{
                //printf("Http error code: %d
    ", $httpCode);//这是阿里原生的结果打印
                //printf("Error msg in body: %s
    ", $rbody);//这是阿里原生的结果打印
                //printf("header: %s
    ", $rheader);//这是阿里原生的结果打印
                return Response::response(1,'获取身份信息失败');
            }
        }
    
        /**
         * 身份证反面识别
         * $param $file 你的文件路径
         * $param $appcode 阿里云APPCODE
         * @param string $file
         */
        public static function back($file='')
        {
            if (empty($file)) {
                return Response::response(1,'图片为空');
            }
            //请求阿里云api地址
            $url = "https://dm-51.data.aliyun.com/rest/160601/ocr/ocr_idcard.json";
            $appcode = config('APPCODE');//读取配置文件阿里云APPCODE
            //你的文件路径
            //$file = "你的文件路径";
            //如果输入带有inputs, 设置为True,否则设为False
            $is_old_format = false;
            //如果没有configure字段,config设为空
            $config = array(
                "side" => "back"//身份证正反面类型:face/back
            );
            //$config = array()
            //打开文件
            if($fp = @fopen($file, "rb", 0)) {
                //$binary = fread($fp, filesize($file)); // 文件读取-filesize无法获取远程文件的大小,只能读取path路径文件
                $binary = self::httpDownload($file); // 文件读取-读取远程图片的二进制流
                fclose($fp);
                $base64 = base64_encode($binary); // 转码
            }else{
                return Response::response(1,'图片打开失败,请检查图片路径是否正确');
            }
            $headers = array();
            array_push($headers, "Authorization:APPCODE " . $appcode);
            //根据API的要求,定义相对应的Content-Type
            array_push($headers, "Content-Type".":"."application/json; charset=UTF-8");
            $querys = "";
            if($is_old_format == TRUE){
                $request = array();
                $request["image"] = array(
                    "dataType" => 50,
                    "dataValue" => "$base64"
                );
    
                if(count($config) > 0){
                    $request["configure"] = array(
                        "dataType" => 50,
                        "dataValue" => json_encode($config)
                    );
                }
                $body = json_encode(array("inputs" => array($request)));
            }else{
                $request = array(
                    "image" => "$base64"
                );
                if(count($config) > 0){
                    $request["configure"] = json_encode($config);
                }
                $body = json_encode($request);
            }
            $method = "POST";
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_FAILONERROR, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HEADER, true);
            if (1 == strpos("$".$url, "https://"))
            {
                curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
            }
            curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
            $result = curl_exec($curl);
            $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
            $rheader = substr($result, 0, $header_size);
            $rbody = substr($result, $header_size);
    
            $httpCode = curl_getinfo($curl,CURLINFO_HTTP_CODE);
            if($httpCode == 200){
                if($is_old_format){
                    $output = json_decode($rbody, true);
                    $result_str = $output["outputs"][0]["outputValue"]["dataValue"];
                }else{
                    $result_str = $rbody;
                }
                //printf("result is :
     %s
    ", $result_str);//这是阿里原生的结果打印
                //身份证读取内容输出
                return Response::response(0, json_decode($result_str));
            }else{
                //printf("Http error code: %d
    ", $httpCode);
                //printf("Error msg in body: %s
    ", $rbody);
                //printf("header: %s
    ", $rheader);
                return Response::response(1,'获取身份信息失败');
            }
        }
    }

    工具类在tp5.0中的结构位置如下图

     正常返回示例

    正面返回结果:
    {
        
        "address"    : "浙江省杭州市余杭区文一西路969号",   #地址信息
        "config_str" : "{\"side\":\"face\"}",                #配置信息,同输入configure
        "face_rect":{
            "angle": -90,
            "center":{
                "x" : 952,
                "y" : 325.5
            },
            "size":{
                "height":181.99,
                "width":164.99
                }
        },                          #人脸位置,center表示人脸矩形中心坐标,size表示人脸矩形长宽,angle表示矩形顺时针旋转的度数。
        "name" : "张三",                                  #姓名
        "nationality": "汉", #民族 
        "num" : "1234567890",                             #身份证号
        "sex" : "男",                                     #性别
        "birth" : "20000101",                             #出生日期
        "nationality" : "汉",                             #民族
        "success" : true                                  #识别结果,true表示成功,false表示失败
    }
    
    
    反面返回结果:
    {
        "config_str" : "{\"side\":\"back\"}",#配置信息,同输入configure
        "start_date" : "19700101",       #有效期起始时间
        "end_date" : "19800101",         #有效期结束时间
        "issue" : "杭州市公安局",         #签发机关
        "success" : true                   #识别结果,true表示成功,false表示失败
    }

    使用此工具类可参考如下步骤

    1.Controller引入工具类 use HelperAutoRecognition;

    2.方法接收参数 idcard_b-身份证正面 idcard_a-身份证国徽面 

    public function save(Request $request)
        {
            $param = $request->only(['username', 'idnum', 'mobile', 'idcard_a', 'idcard_b']);
            $param['userid'] = $this->userid;
            $param['status'] = 0;
            
            //身份证正面识别
            $res = self::check_idcard_face_message($param);
            if (!$res) {
                return Response::response(1,'填写身份证号码与证件号码不符');
            }
            //身份证反面识别
            $res1 = self::check_idcard_back_message($param);
            if (!$res1) {
                return Response::response(1,'身份证已过期');
            }
        }

    3.调用工具类验证

    /**
         * 身份证正面信息校对
         * @param $file 身份证正面图片
         * @return bool
         */
        public static function check_idcard_face_message($param)
        {
            if ($param['idcard_b']) {
                $file = get_image_url($param['idcard_b']);
            } else {
                return false;
            }
            //调取阿里身份认证api获取身份证信息
            $data =  AutoRecognition::face($file);
            //dump($data);exit;
            if($data['data'] != '获取身份信息失败' && $data['data']->num == $param['idnum']){
                return true;
            }else{
                return false;
            }
        }
    
        /**
         * 身份证反面信息校对
         * @param $file 身份证反面图片-国徽面
         * @return bool
         */
        public static function check_idcard_back_message($param)
        {
            if ($param['idcard_a']) {
                $file = get_image_url($param['idcard_a']);
            } else {
                return false;
            }
            //调取阿里身份认证api获取身份证信息
            $data =  AutoRecognition::back($file);
            //dump($data);exit;
            if ($data['data'] != '获取身份信息失败') {
                $end_date = $data['data']->end_date;//提取身份证过期时间
                $y = substr($end_date,0,4);//截取年
                $m = substr($end_date,4,2);//截取月
                $d = substr($end_date,6,2);//截取日
                $last_date_unix = strtotime($y.'-'.$m.'-'.$d);//身份证截止日时间戳
                $today_unid = strtotime(date('Y-m-d'));//今日时间戳
                //身份证截止日时间戳 > 今日时间戳,身份证未过期,返回true
                if($last_date_unix > $today_unid){
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
    
        }
  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/clubs/p/9150642.html
Copyright © 2011-2022 走看看