之前写了一篇利用百度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;
}