zoukankan      html  css  js  c++  java
  • 百度OCR文字识别-身份证识别

    总目录地址:AI 系列 总目录 

    需要最新源码,或技术提问,请加QQ群:538327407

    我的各种github 开源项目和代码:https://github.com/linbin524

    简介

     答应了园区大牛张善友 要写AI 的系列博客,所以开始了AI 系列之旅。

    一、介绍

    身份证识别 API 接口文档地址:http://ai.baidu.com/docs#/OCR-API/top

    接口描述

    用户向服务请求识别身份证,身份证识别包括正面和背面。

    请求说明

    请求示例

    HTTP 方法:POST

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

    备注:你需要 成为百度开发者,获取API key 和Secret Key

     Access_Token 的获取

    百度Access_token 有效期有时间限制,大概是30天左右,所以建议封装成功能方法每次调用最新的。

    • access_token:要获取的Access Token;
    • expires_in:Access Token的有效期(秒为单位,一般为1个月);

    二、技术实现

    百度 文字识别 有提供SDK。如果有支持的语言,可以直接用sdk。笔者自己用的Http 请求封装

    对于图片大小有要求的,图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式

    接口基础封装

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace BaiduAIAPI.Model
     8 {
     9 
    10     public class AccessTokenModel {
    11 
    12         public bool IsSuccess { get; set; }
    13         public SuccessAccessTokenModel SuccessModel { get; set; }
    14         public ErrorAccessTokenModel ErrorModel { get; set; }
    15 
    16     }
    17 
    18     /// <summary>
    19     /// 获取accesstoken,正常 的 百度接口返回的json 实体模型
    20     /// </summary>
    21     public class SuccessAccessTokenModel
    22     {
    23         public string refresh_token { get; set; }
    24         public int expires_in { get; set; }
    25         public string scope { get; set; }
    26         public string session_key { get; set; }
    27         public string session_secret { get; set; }
    28 
    29         public string access_token { get; set; }
    30     }
    31 
    32     /// <summary>
    33     /// 获取accesstoken,失败的 百度接口返回的json 实体模型
    34     /// </summary>
    35     public class ErrorAccessTokenModel
    36     {
    37         public string error { get; set; }
    38         public string error_description { get; set; }
    39 
    40     }
    41 }
      1 using System;
      2 using System.IO;
      3 using System.Net;
      4 using System.Text;
      5 using System.Web;
      6 using AOP.Common;
      7 using AOP.Common.DataConversion;
      8 using BaiduAIAPI.Model;
      9 using BaiduAIAPI.Type;
     10 
     11 namespace BaiduAIAPI.ORC_Characterbase64
     12 {
     13 
     14     /// <summary>
     15     /// 文字识别--身份证识别 应用(只是获取身份证图片 信息,没有和公安部联网,无法确认真假,只是单纯从图片上识别文字)
     16     /// </summary>
     17     public class IDCardRecognition
     18     {
     19         // 身份证识别
     20 
     21         /// <summary>
     22         /// 身份证识别
     23         /// </summary>
     24         /// <param name="token">Accesstoken</param>
     25         /// <param name="imagePath">图片路径</param>
     26         /// <param name="recognitionString">识别结果</param>
     27         /// <param name="errorMsg">错误信息</param>
     28         /// <param name="id_card_side"> front:身份证正面;back:身份证背面</param>
     29         /// <param name="detect_direction">是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:- true:检测朝向;- false:不检测朝向。</param>
     30         /// <param name="detect_risk"> string 类型 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能,默认不开启,即:false。可选值:true-开启;false-不开启</param>
     31         /// <returns>结果状态</returns>
     32         public static IDCardRecognitionModel GetIdcardRecognitionString(string token, string imagePath, ref string recognitionString, out string errorMsg, string id_card_side="front", bool detect_direction=false, string detect_risk="false")
     33         {
     34             bool resultState = true;
     35             IDCardRecognitionModel tempModel = new IDCardRecognitionModel();
     36 
     37             try
     38             {
     39                 #region 基础校验
     40                 string verificationMsg = "";
     41                 errorMsg = "";
     42                 bool isVerification = ImageVerification.VerificationImage(imagePath, out verificationMsg);
     43                 if (!isVerification)
     44                 {
     45 
     46                     errorMsg += verificationMsg;
     47                     tempModel.state = false;
     48                     tempModel.errorMsg = errorMsg;
     49                     return tempModel;
     50                 }
     51                 string strbaser64 = ConvertDataFormatAndImage.ImageToByte64String(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 图片的base64编码
     52                 Encoding encoding = Encoding.Default;
     53                 string urlEncodeImage = HttpUtility.UrlEncode(strbaser64);
     54 
     55                 byte[] tempBuffer = encoding.GetBytes(urlEncodeImage);
     56 
     57                 if (tempBuffer.Length > 1024 * 1024 * 4)
     58                 {
     59 
     60                     errorMsg += "图片加密 后的大小超过4MB!";
     61                     recognitionString = "";
     62                     tempModel.state = false;
     63                     tempModel.errorMsg = errorMsg;
     64                     return tempModel;
     65 
     66                 }
     67                 #endregion
     68 
     69                 #region 请求接口
     70                 recognitionString = "";
     71 
     72                 string host = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=" + token;
     73                 String str = "id_card_side=" + id_card_side + "&detect_direction=" + detect_direction + "&detect_risk=" + detect_risk + "&image=" + HttpUtility.UrlEncode(strbaser64);
     74                 var tempResult = HttpRequestHelper.Post(host, str);
     75                 recognitionString = tempResult;
     76 
     77                
     78                 if (recognitionString.Contains(""error_code""))//说明异常
     79                 {
     80                     resultState = false;
     81                     tempModel.state = false;
     82                     tempModel.errorTypeModel = Json.ToObject<ErrorTypeModel>(tempResult);
     83                     tempModel.errorTypeModel.error_discription = ORC_CharacterRecognitionErrorType.GetErrorCodeToDescription(tempModel.errorTypeModel.error_code);
     84                 }
     85                 else
     86                 {
     87                     tempModel.state = true;
     88                     tempModel.successModel = Json.ToObject<IDCardRecognitionSuccessResultModel>(tempResult);
     89                 }
     90                 #endregion
     91 
     92                 return tempModel;
     93             }
     94             catch (Exception ex)//接口外部异常,如网络异常
     95             {
     96                 resultState = false;
     97                 errorMsg = ex.ToString();
     98                 tempModel.state = false;
     99                 tempModel.errorMsg = ex.ToString();
    100                 return tempModel;
    101                
    102             }
    103         }
    104 
    105     }
    106 
    107 }

     winform 调用核心部分

     1 /// <summary>
     2         /// 识别操作
     3         /// </summary>
     4         /// <param name="filePath"></param>
     5         /// <param name="id_card_side">身份证 正面还是背面</param>
     6         /// <param name="detect_direction"></param>
     7         /// <param name="detect_risk"></param>
     8         public void Distinguish(string filePath, string id_card_side = "front", bool detect_direction = false, string detect_risk = "false")
     9         {
    10             DoTime();//主线程执行进度条,子线程进行数据请求操作
    11             t1 = new Thread(new ThreadStart(() =>
    12             {
    13 
    14                 var temp = BaiduAIAPI.Access_Token.GetAccessToken();
    15                 if (temp.IsSuccess)
    16                 {
    17                     string data = "";
    18                     string error = "";
    19                     var result = IDCardRecognition.GetIdcardRecognitionString(temp.SuccessModel.access_token, filePath, ref data, out error, id_card_side, detect_direction, detect_risk);
    20                     this.Invoke(new Action(() =>
    21                     {
    22                         tb_showInfo.AppendText("
     -----------------------------------------------------------------");
    23                     }));
    24 
    25                     if (result.state)
    26                     {
    27                         this.Invoke(new Action(() =>
    28                         {
    29                             tb_showInfo.AppendText("
     ---------------------------识别成功-------------------------------");
    30                             tb_showInfo.AppendText("
    " + result.successModel.ToJson() + "
    ");
    31                         }));
    32 
    33                     }
    34                     else
    35                     {
    36                         this.Invoke(new Action(() =>
    37                         {
    38 
    39                             tb_showInfo.AppendText("
    -----------------------------识别失败!--------------------------------");
    40                             tb_showInfo.AppendText("
    " + result.successModel.ToJson() + result.errorMsg + "
    ");
    41                         }));
    42 
    43                     }
    44                 }
    45                 else
    46                 {
    47                     this.Invoke(new Action(() =>
    48                     {
    49                         AttrMessage.ErrorMsg(temp.ErrorModel.error);
    50                     }));
    51 
    52                 }
    53 
    54                 this.Invoke(new Action(() =>
    55                 {
    56                     progressBar_ToReadDistinguish.Value = 100;
    57                     timer1.Enabled = false;
    58                     progressBar_ToReadDistinguish.Value = 0;
    59                 }));
    60             }));
    61 
    62             t1.IsBackground = true;
    63            t1.Start();
    64 
    65         }

    效果如图:图中的身份证是我百度贴吧搜索的,不知道真伪。

    PS:这个只是文字识别,并不是真正公安部联网识别(身份有效性识别),要连接公安部识别需要 付费。

    三、整合应用

    笔者的应用是结合自己写的插件化热插拔模式写的,把每个接口封装成为一个插件,采用注入形式动态化结合

    为了便于友好用户体验,在请求使用加入进度条,采用新的线程去进行接口请求,防止 界面卡住。

     源码地址:https://github.com/linbin524/AI_Project/tree/master

     

    读后感觉不错,有收获可以微信请作者喝杯咖啡,读后有疑问请加微信,拉群研讨,注明来意

  • 相关阅读:
    JS中的宽高(基础知识很重要)
    JS基础知识总结
    Spring中的JdbcTemplate使用
    Spring中集合类型属性注入
    白盒交换机公司&产品列表
    虚拟化有哪几种架构
    全虚拟化与半虚拟化
    白牌交换机现状分析zz
    SDN控制器列表
    Arista公司
  • 原文地址:https://www.cnblogs.com/linbin524/p/BaiduOCR_IDCard.html
Copyright © 2011-2022 走看看