C#百度OCR-身份证图片识别提取信息

之前写了一篇利用百度OCR进行本地和网络图片识别文字的文章,点击查看。今天补充识别身份证图片的文章及demo

源码地址:https://download.csdn.net/download/horseroll/10681214

效果图展示:

调用的是百度的API接口。API文档:http://ai.baidu.com/docs#/OCR-API/top

请求的URL地址(post):https://aip.baidubce.com/rest/2.0/ocr/v1/idcard

请求参数:

返回参数:

1.首先先根据API key和Secret key得到token。API key和Secret key去百度云的控制台可以免费申请

string token=getAccessToken();
// 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
// 返回token示例
public static String TOKEN = "24.adda70c11b9786206253ddb70affdc46.2592000.1493524354.282335-1234567";

// 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
private static String clientId = "cohIahxAt7HveHLYSHYK6G5N";
// 百度云中开通对应服务应用的 Secret Key
private static String clientSecret = "e8SAsDIWSK9NPUKviYiPQNlfaVDXQSY5";

public static String getAccessToken()
{
    String authHost = "https://aip.baidubce.com/oauth/2.0/token";
    //string result = ToolData.HttpPost(authHost, "grant_type=client_credentials&client_id="+clientId+"&client_secret="+clientSecret);
    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;
    Console.WriteLine(result);
    return result;
}

2.本地图片进行上传解析(POST提交)其实就是一句post代码

private void btnlocal_Click(object sender, EventArgs e)
{
    OpenFileDialog filename = new OpenFileDialog();
    filename.InitialDirectory = Application.StartupPath;
    filename.Filter = "All files(*.*)|*.*|image files|*.jpg;*.png;*.bmp";
    filename.FilterIndex = 2;
    filename.RestoreDirectory = true;
    if (filename.ShowDialog() == DialogResult.OK)
    {
        //本地图片.解析图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效
        bool cardjiaodu = cbjiaodu.Text == "true" ? true : false;
        string cardzhengfan= cbzhengfan.Text == "front" ? "front" : "back";
        bool cardfengxian = cbfengxian.Text == "true" ? true : false;
        string local = filename.FileName.ToString();//本地图片的路径地址
        tblocal.Text = local;
        string base64 = UrlEncode(ImgToBase64String(Image.FromFile(local)));
        string localpicure = ToolData.HttpPost("https://aip.baidubce.com/rest/2.0/ocr/v1/idcard", "access_token=" + token + "&detect_direction=" + cardjiaodu + "&id_card_side=" + cardzhengfan + "&image=" + base64 + "&detect_risk=" + cardfengxian);
        WriteTo(localpicure);
        pictureBox1.Image = Image.FromFile(local);
    }
}

附带上图片转base64代码

public String ImgToBase64String(Image bmp)
{
    String strbaser64 = String.Empty;
    var btarr = convertByte(bmp);
    strbaser64 = Convert.ToBase64String(btarr);

    return strbaser64;
}
/// <summary>
/// Image转byte[]
/// </summary>
/// <param name="img">Img格式数据</param>
/// <returns>byte[]格式数据</returns>
public static byte[] convertByte(Image img)
{
    MemoryStream ms = new MemoryStream();
    img.Save(ms, img.RawFormat);
    byte[] bytes = ms.ToArray();
    ms.Close();
    return bytes;
}
public static string UrlEncode(string str)
{
    StringBuilder sb = new StringBuilder();
    byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)
    for (int i = 0; i < byStr.Length; i++)
    {
        sb.Append(@"%" + Convert.ToString(byStr[i], 16));
    }
    return (sb.ToString());
}

3.识别后的json内容进行输出

/// <summary>
/// 在界面上显示
/// </summary>
/// <param name="returnstr"></param>
public void WriteTo(string returnstr)
{
    try
    {
        ReturnJsonForCard rj = CYQ.Data.Tool.JsonHelper.ToEntity<ReturnJsonForCard>(returnstr);
        AReturnJsonForCard acj = CYQ.Data.Tool.JsonHelper.ToEntity<AReturnJsonForCard>(rj.words_result);
        string resultstr = "";
        resultstr += "姓名:"+acj.姓名.words + "\r\n"+ "性别:" + acj.性别.words + "\r\n"+ "民族:" + acj.民族.words + "\r\n"+ "出生:" + acj.出生.words + "\r\n"+ "住址:" + acj.住址.words + "\r\n"+ "公民身份号码:" + acj.公民身份号码.words + "\r\n";
        string card_direction = "";
        if(rj.direction=="-1")
        {
            card_direction = "未定义";
        }
        else if (rj.direction == "0")
        {
            card_direction = "正向";
        }
        else if (rj.direction == "1")
        {
            card_direction = "逆时针90度";
        }
        else if (rj.direction == "2")
        {
            card_direction = "逆时针180度";
        }
        else if (rj.direction == "3")
        {
            card_direction = "逆时针270度";
        }
        resultstr += "图像方向:" + card_direction + "\r\n";

        string card_image_status = "";
        if(rj.image_status=="normal")
        {
            card_image_status = "识别正常";
        }
        else if(rj.image_status == "reversed_side")
        {
            card_image_status = "身份证正反面颠倒";
        }
        else if (rj.image_status == "non_idcard")
        {
            card_image_status = "上传的图片中不包含身份证";
        }
        else if (rj.image_status == "blurred")
        {
            card_image_status = "身份证模糊";
        }
        else if (rj.image_status == "other_type_card")
        {
            card_image_status = "其他类型证照";
        }
        else if (rj.image_status == "over_exposure")
        {
            card_image_status = "身份证关键字段反光或过曝";
        }
        else if (rj.image_status == "unknown")
        {
            card_image_status = "未知状态";
        }

        resultstr += "识别状态:" + card_image_status + "\r\n";

        string card_risk_type = "";
        if (rj.risk_type == "normal")
        {
            card_risk_type = "正常";
        }
        else if(rj.risk_type == "copy")
        {
            card_risk_type = "复印件";
        }
        else if (rj.risk_type == "temporary")
        {
            card_risk_type = "临时身份证";
        }
        else if (rj.risk_type == "screen")
        {
            card_risk_type = "翻拍";
        }
        else if (rj.risk_type == "unknown")
        {
            card_risk_type = "其他未知情况";
        }
        resultstr += "识别身份证类型:" + card_risk_type + "\r\n";

        resultstr += "图片编辑工具:" + rj.edit_tool + "\r\n";
        richTextBox1.Clear();
        richTextBox1.AppendText(resultstr);
    }
    catch (Exception ex)
    {
        MessageBox.Show("解析出错,出错原因:" + ex.Message);
    }
}

5.json字符串的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 百度OCR
{
    public class ReturnJsonForCard
    {
        public string log_id { get; set; }
        public string direction { get; set; }
        public string image_status { get; set; }
        public string risk_type { get; set; }
        public string edit_tool { get; set; }
        public string words_result_num { get; set; }
        public string words_result { get; set; }
    }
    public class AReturnJsonForCard
    {
        public BReturnJsonForCard 住址 { get; set; }
        public BReturnJsonForCard 出生 { get; set; }
        public BReturnJsonForCard 姓名 { get; set; }
        public BReturnJsonForCard 公民身份号码 { get; set; }
        public BReturnJsonForCard 性别 { get; set; }
        public BReturnJsonForCard 民族 { get; set; }
    }
    public class BReturnJsonForCard
    {
        public string location { get; set; }
        public string words { get; set; }
    }
}

6.HttpPost方法。也可以自己用其他post方法

/// <summary>
/// HTTP POST方式请求数据
/// </summary>
/// <param name="url">URL.</param>
/// <param name="param">POST的数据</param>
/// <returns></returns>
public static string HttpPost(string url, string param)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.Accept = "*/*";
    request.Timeout = 15000;
    request.AllowAutoRedirect = false;
    StreamWriter requestStream = null;
    WebResponse response = null;
    string responseStr = null;
    try
    {
        requestStream = new StreamWriter(request.GetRequestStream());
        requestStream.Write(param);
        requestStream.Close();
        response = request.GetResponse();
        if (response != null)
        {
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            responseStr = reader.ReadToEnd();
            reader.Close();
        }
    }
    catch (Exception)
    {
        throw;
    }
    finally
    {
        request = null;
        requestStream = null;
        response = null;
    }
    return responseStr;
}

猜你喜欢

转载自blog.csdn.net/HorseRoll/article/details/82800762