请选择 进入手机版 | 继续访问电脑版
虚位以待    招租QQ:244594752    尺寸:960x60
终身VIP需技术指导请加(官方QQ :244594752 )
加入我们,终身VIP只需159元,全站下载(老客户请联系我补差价即可升级)
查看: 197|回复: 2

百度OCR文字识别-身份证识别

[复制链接]

该用户从未签到

2212

主题

2244

帖子

7676

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7676
发表于 2018-6-15 15:22:15 | 显示全部楼层 |阅读模式
简介
一、介绍

身份证识别 API 接口文档地址:http://ai.baidu.com/docs#/OCR-API/top
接口描述
用户向服务请求识别身份证,身份证识别包括正面和背面。
请求说明
请求示例
HTTP 方法:POST

备注:你需要 成为百度开发者,获取API key 和Secret Key
580722-20171208093521363-1612713026.png

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格式

接口基础封装
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaiduAIAPI.Model
{

    public class AccessTokenModel {

        public bool IsSuccess { get; set; }
        public SuccessAccessTokenModel SuccessModel { get; set; }
        public ErrorAccessTokenModel ErrorModel { get; set; }

    }

    /// <summary>
    /// 获取accesstoken,正常 的 百度接口返回的json 实体模型
    /// </summary>
    public class SuccessAccessTokenModel
    {
        public string refresh_token { get; set; }
        public int expires_in { get; set; }
        public string scope { get; set; }
        public string session_key { get; set; }
        public string session_secret { get; set; }

        public string access_token { get; set; }
    }

    /// <summary>
    /// 获取accesstoken,失败的 百度接口返回的json 实体模型
    /// </summary>
    public class ErrorAccessTokenModel
    {
        public string error { get; set; }
        public string error_description { get; set; }

    }
}

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using AOP.Common;
using AOP.Common.DataConversion;
using BaiduAIAPI.Model;
using BaiduAIAPI.Type;

namespace BaiduAIAPI.ORC_Characterbase64
{

    /// <summary>
    /// 文字识别--身份证识别 应用(只是获取身份证图片 信息,没有和公安部联网,无法确认真假,只是单纯从图片上识别文字)
    /// </summary>
    public class IDCardRecognition
    {
        // 身份证识别

        /// <summary>
        /// 身份证识别
        /// </summary>
        /// <param name="token">Accesstoken</param>
        /// <param name="imagePath">图片路径</param>
        /// <param name="recognitionString">识别结果</param>
        /// <param name="errorMsg">错误信息</param>
        /// <param name="id_card_side"> front:身份证正面;back:身份证背面</param>
        /// <param name="detect_direction">是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:- true:检测朝向;- false:不检测朝向。</param>
        /// <param name="detect_risk"> string 类型 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能,默认不开启,即:false。可选值:true-开启;false-不开启</param>
        /// <returns>结果状态</returns>
        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")
        {
            bool resultState = true;
            IDCardRecognitionModel tempModel = new IDCardRecognitionModel();

            try
            {
                #region 基础校验
                string verificationMsg = "";
                errorMsg = "";
                bool isVerification = ImageVerification.VerificationImage(imagePath, out verificationMsg);
                if (!isVerification)
                {

                    errorMsg += verificationMsg;
                    tempModel.state = false;
                    tempModel.errorMsg = errorMsg;
                    return tempModel;
                }
                string strbaser64 = ConvertDataFormatAndImage.ImageToByte64String(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 图片的base64编码
                Encoding encoding = Encoding.Default;
                string urlEncodeImage = HttpUtility.UrlEncode(strbaser64);

                byte[] tempBuffer = encoding.GetBytes(urlEncodeImage);

                if (tempBuffer.Length > 1024 * 1024 * 4)
                {

                    errorMsg += "图片加密 后的大小超过4MB!";
                    recognitionString = "";
                    tempModel.state = false;
                    tempModel.errorMsg = errorMsg;
                    return tempModel;

                }
                #endregion

                #region 请求接口
                recognitionString = "";

                string host = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=" + token;
                String str = "id_card_side=" + id_card_side + "&detect_direction=" + detect_direction + "&detect_risk=" + detect_risk + "&image=" + HttpUtility.UrlEncode(strbaser64);
                var tempResult = HttpRequestHelper.Post(host, str);
                recognitionString = tempResult;


                if (recognitionString.Contains("\"error_code\""))//说明异常
                {
                    resultState = false;
                    tempModel.state = false;
                    tempModel.errorTypeModel = Json.ToObject<ErrorTypeModel>(tempResult);
                    tempModel.errorTypeModel.error_discription = ORC_CharacterRecognitionErrorType.GetErrorCodeToDescription(tempModel.errorTypeModel.error_code);
                }
                else
                {
                    tempModel.state = true;
                    tempModel.successModel = Json.ToObject<IDCardRecognitionSuccessResultModel>(tempResult);
                }
                #endregion

                return tempModel;
            }
            catch (Exception ex)//接口外部异常,如网络异常
            {
                resultState = false;
                errorMsg = ex.ToString();
                tempModel.state = false;
                tempModel.errorMsg = ex.ToString();
                return tempModel;

            }
        }

    }

}

winform 调用核心部分
/// <summary>
        /// 识别操作
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="id_card_side">身份证 正面还是背面</param>
        /// <param name="detect_direction"></param>
        /// <param name="detect_risk"></param>
        public void Distinguish(string filePath, string id_card_side = "front", bool detect_direction = false, string detect_risk = "false")
        {
            DoTime();//主线程执行进度条,子线程进行数据请求操作
            t1 = new Thread(new ThreadStart(() =>
            {

                var temp = BaiduAIAPI.Access_Token.GetAccessToken();
                if (temp.IsSuccess)
                {
                    string data = "";
                    string error = "";
                    var result = IDCardRecognition.GetIdcardRecognitionString(temp.SuccessModel.access_token, filePath, ref data, out error, id_card_side, detect_direction, detect_risk);
                    this.Invoke(new Action(() =>
                    {
                        tb_showInfo.AppendText("\r\n -----------------------------------------------------------------");
                    }));

                    if (result.state)
                    {
                        this.Invoke(new Action(() =>
                        {
                            tb_showInfo.AppendText("\r\n ---------------------------识别成功-------------------------------");
                            tb_showInfo.AppendText("\r\n" + result.successModel.ToJson() + "\r\n");
                        }));

                    }
                    else
                    {
                        this.Invoke(new Action(() =>
                        {

                            tb_showInfo.AppendText("\r\n-----------------------------识别失败!--------------------------------");
                            tb_showInfo.AppendText("\r\n" + result.successModel.ToJson() + result.errorMsg + "\r\n");
                        }));

                    }
                }
                else
                {
                    this.Invoke(new Action(() =>
                    {
                        AttrMessage.ErrorMsg(temp.ErrorModel.error);
                    }));

                }

                this.Invoke(new Action(() =>
                {
                    progressBar_ToReadDistinguish.Value = 100;
                    timer1.Enabled = false;
                    progressBar_ToReadDistinguish.Value = 0;
                }));
            }));

            t1.IsBackground = true;
           t1.Start();

        }




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


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

三、整合应用

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

580722-20171208095704378-1595063679.png


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


回复

使用道具 举报

该用户从未签到

0

主题

180

帖子

366

积分

禁止发言

积分
366
发表于 2018-8-23 07:33:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

5

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2018-10-25 21:51:23 | 显示全部楼层
如果嫌去澳门太麻烦的话,在家就能开户玩。名爵国际 娱 乐 城 斥资1500亿打造网上最佳投资平台,持菲律宾正规 博 彩 执照,单个用户日最高可提款5000万,3-5分钟即可到账。官方网址:900868.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|妙想源码社区 积分提现

GMT+8, 2018-11-15 01:31 , Processed in 1.153948 second(s), 27 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2020 Comsenz Inc.

快速回复 返回顶部 返回列表
 
FDGDF
客服QQ 妙想科技 244594752
【旺旺】 点击这里给我发消息
【邮箱】
244594752@qq.com
【地址】 湖南省常德市武陵区三姑巷77
【妙想科技】 【9188qhl.com】