zoukankan      html  css  js  c++  java
  • OCR智能识别身份信息

    本人研究了两款OCR智能识别的API,下面做详解!

    第一款是百度云的OCR识别,填写配置信息,每天有五百次免费的识别次数,适合中小型客户流量可以使用。API文档:http://ai.baidu.com/docs#/OCR-API/top

         public static String Token = ""; // 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
            private static String clientId = SysConfigManager.Get("bdy_config", "api_key");//"**********"; // 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
            private static String clientSecret = SysConfigManager.Get("bdy_config", "Secret_Key");//"***********"; 
    
         /// <summary>
            /// 获取百度云 access_token
            /// </summary>
            /// <returns></returns>
            public static string GetbaiduAccessToken()
            {
                Token = Convert.ToString(HiCache.Get("access_token"));
                if (string.IsNullOrEmpty(Token))
                {
                    String authHost = "https://aip.baidubce.com/oauth/2.0/token";
                    HttpClient client = new HttpClient();
                    List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();
                    paraList.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
                    paraList.Add(new KeyValuePair<string, string>("client_id", clientId));
                    paraList.Add(new KeyValuePair<string, string>("client_secret", clientSecret));
    
                    HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
                    String result = response.Content.ReadAsStringAsync().Result;
    
                    JObject ResObj = JsonHelper.DeserializeJsonToObject<JObject>(result);
                    if (string.IsNullOrEmpty(Convert.ToString(ResObj.GetValue("access_token"))))
                    {
                        Globals.Debuglog("---获取身份验证access_token失败:" + result, "_IdentifyCard.txt");
                        return Token;
                    }
                    HiCache.Insert("access_token", ResObj.GetValue("access_token"), 2592000);  //access_toke 时效30天,需设置缓存重新获取
                    Token = ResObj.GetValue("access_token").ToString();
                }
                return Token;
            }
    
            /// <summary>
            /// 根据access_token获取身份证信息
            /// </summary>
            /// <param name="path"></param>
            /// <param name="cardside">身份证正反面(front-正面,back-反面)</param>
            /// <param name="IsDelFile">是否删除图片</param>
            /// <returns></returns>
            public static string idcard(string path,string cardside,bool IsDelFile, out string outError)
            {
                outError = string.Empty;
                string token = GetbaiduAccessToken();
                if (!string.IsNullOrEmpty(token))
                {
                    try
                    {
                        string ext = Path.GetExtension(path).ToLower(); ;
                        if (!ext.Equals(".jpg")  && !ext.Equals(".png") && !ext.Equals(".bmp"))
                        {
                            outError = "识别的图片仅支持(jpg、png、bmp)格式";
                            return "";
                        }
                        string strbaser64 = Convert.ToBase64String(System.IO.File.ReadAllBytes(path));
                        string host = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=" + token;
                        Encoding encoding = Encoding.Default;
                        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
                        request.Method = "post";
                        request.ContentType = "application/x-www-form-urlencoded";
                        request.KeepAlive = true;
                        String str = "id_card_side="+ cardside + "&image=" + HttpUtility.UrlEncode(strbaser64);
                        byte[] buffer = encoding.GetBytes(str);
                        request.ContentLength = buffer.Length;
                        request.GetRequestStream().Write(buffer, 0, buffer.Length);
                        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                        string result = reader.ReadToEnd();
                        string StrResult = Getcardinfo(result, cardside,out outError);
                        if (IsDelFile)
                        {
                            File.Delete(path);
                        }
                        return StrResult;
                    }
                    catch (Exception)
                    {
                        outError = "识别异常!";
                        File.Delete(path);
                    }
                }
                return "";
    
            }
    
            /// <summary>
            /// 对返回的身份信息进行打包确认
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            public static string Getcardinfo(string str,string cardside,out string outError)
            {
                outError = string.Empty;
                JObject Obj = JsonHelper.DeserializeJsonToObject<JObject>(str);
                string status = Convert.ToString(Obj.GetValue("image_status"));
                string strResult = "";
                if (status == "normal")
                {
                    if (cardside == "front")
                    {
                        IdentifyInfo info = new IdentifyInfo();
                        info.Address = Obj["words_result"]["住址"]["words"].ToString();
                        info.DataBirth = Obj["words_result"]["出生"]["words"].ToString();
                        info.UserName = Obj["words_result"]["姓名"]["words"].ToString();
                        info.IdCard = Obj["words_result"]["公民身份号码"]["words"].ToString();
                        info.Sex = Obj["words_result"]["性别"]["words"].ToString();
                        info.FamousFamily = Obj["words_result"]["民族"]["words"].ToString();
                        strResult = JsonHelper.SerializeObject(info);
                    }
                    else
                    { strResult = str; }
                }
                else
                {
                    switch (status)
                    {
                        case "reversed_side":outError = "未摆正身份证!";break;
                        case "non_idcard": outError = "上传的图片不是身份证!"; break;
                        case "blurred": outError = "身份证模糊!"; break;
                        case "over_exposure": outError = "身份证关键字段反光或过曝!"; break;
                        default: outError = cardside == "front" ? "请正确上传身份证正面!": "请正确上传身份证背面!"; break;
                    }
                }
                return strResult;
            }
         /// <summary>
            /// 创建临时地址文件
            /// </summary>
            /// <returns></returns>
            private static string GetPath()
            {
                string path = "";
                try
                {
                    path = HttpContext.Current.Request.MapPath("~/Identify");
                }
                catch (Exception e)
                {
                    path = Utils.ApplicationPath + "/Identify";
                }
    
                if (!FileHelper.FileExists(path))
                {
                    Directory.CreateDirectory(path);
                }
                path += "\" + DateTime.Now.ToString("yyyyMMddHHmmss") + CommonHelper.RandomNum(4);
                //if (!FileHelper.FileExists(path))
                //{
                //    Directory.CreateDirectory(path);
                //}
                return path;
            }
        [Serializable]
        public class IdentifyInfo
        {
            public string Address { get; set; }
    
            public string DataBirth { get; set; }
    
            public string UserName { get; set; }
    
            public string IdCard { get; set; }
    
            public string Sex { get; set; }
    
            //名族
            public string FamousFamily { get; set; }
    
        }

    第二款是祥云科技的OCR云服务平台,这里的识别更精确一点,但是消费有点贵。API文档:http://www.netocr.com/developers.do?id=4

         /// <summary>
            /// 上传图片到翔云进行身份证识别
            /// </summary>
            /// <param name="filePath">要上传的文件路径</param>
            /// <returns></returns>
            public string PostIdCardDataToXiangYun(string filePath)
            {
                string url = "http://netocr.com/api/recog.do";
                System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();
                httpClient.MaxResponseContentBufferSize = 256000;
                httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36");
                FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                System.Net.Http.MultipartFormDataContent content = new System.Net.Http.MultipartFormDataContent();
                //增加文件数据
                content.Add(new System.Net.Http.StreamContent(fileStream), "file", "idcard.jpg");
                //增加参数
                content.Add(new StringContent("key************"), "key");
                content.Add(new StringContent("secret**********"), "secret");
                //二代身份证正面识别
                content.Add(new StringContent(CardStatus.TwoIdentityCardsFront.ToString()), "typeId");
                content.Add(new StringContent("json"), "format");
                System.Net.Http.HttpResponseMessage response = httpClient.PostAsync(new Uri(url), content).Result;
                string result = response.Content.ReadAsStringAsync().Result;
                fileStream.Close();
                return result;
            }
  • 相关阅读:
    Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
    DHCP "No subnet declaration for xxx (no IPv4 addresses)" 报错
    Centos安装前端开发常用软件
    kubernetes学习笔记之十:RBAC(二)
    k8s学习笔记之StorageClass+NFS
    k8s学习笔记之ConfigMap和Secret
    k8s笔记之chartmuseum搭建
    K8S集群集成harbor(1.9.3)服务并配置HTTPS
    Docker镜像仓库Harbor1.7.0搭建及配置
    Nginx自建SSL证书部署HTTPS网站
  • 原文地址:https://www.cnblogs.com/wt-vip/p/7019239.html
Copyright © 2011-2022 走看看