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

简介 

 答应了园区大牛张善友 要写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格式

 

接口基础封装

 

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();


        }

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

 

 

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

 

三、整合应用

 

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

 

 

 

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


相关文章: 

  • Build 2017  | 一文看懂微软 Build 2017 大会:让 AI 走向边缘

  • 认识微软Visual Studio Tools for AI

  • VS Tools for AI全攻略

  • VS Tools for AI全攻略(2)低配置虚拟机也能玩转深度学习,无需NC/NV系列

  • 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

原文:http://www.cnblogs.com/linbin524/p/BaiduOCR_IDCard.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot Elasticsearch 入门

转载自 芋道 Spring Boot Elasticsearch 入门 1. 概述 如果胖友之前有用过 Elasticsearch 的话&#xff0c;可能有过被使用的 Elasticsearch 客户端版本搞死搞活。如果有&#xff0c;那么一起握个抓。所以&#xff0c;我们在文章的开始&#xff0c;先一起理一理这块。 Elas…

在.NET Core类库中使用EF Core迁移数据库到SQL Server

前言 如果大家刚使用EntityFramework Core作为ORM框架的话&#xff0c;想必都会遇到数据库迁移的一些问题。 起初我是在ASP.NET Core的Web项目中进行的&#xff0c;但后来发现放在此处并不是很合理&#xff0c;一些关于数据库的迁移&#xff0c;比如新增表&#xff0c;字段&…

Spring Boot MongoDB 入门

转载自 芋道 Spring Boot MongoDB 入门 1. 概述 可能有一些胖友对 MongoDB 不是很了解&#xff0c;这里我们引用一段介绍&#xff1a; FROM 《分布式文档存储数据库 MongoDB》 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最…

Spring框架-事务管理注意事项

转载自 Spring框架-事务管理注意事项 常见事务问题 事务不起作用 可能是配置不起效&#xff0c;如扫描问题 事务自动提交了&#xff08;批量操作中&#xff09; 可能是在没事务的情况下&#xff0c;利用了数据库的隐式提交 事务配置说明 通常情况下我们的Spring Component扫…

Ocelot统一权限验证

Ocelot作为网关&#xff0c;可以用来作统一验证&#xff0c;接上一篇博客Ocelot网关&#xff0c;我们继续 前一篇&#xff0c;我们创建了OcelotGateway网关项目&#xff0c;DemoAAPI项目&#xff0c;DemoBAPI项目&#xff0c;为了验证用户并分发Token&#xff0c;现在还需要添…

Spring Boot之程序性能监控

转载自 Spring Boot之程序性能监控 Spring Boot特别适合团队构建各种可快速迭代的微服务&#xff0c;同时为了减少程序本身监控系统的开发量&#xff0c;Spring Boot提供了actuator模块&#xff0c;可以很方便的对你的Spring Boot程序做监控。 1. actuator接口说明 Spring B…

laravel部署在linux出现404 not found

laravel项目放在本地服务器后&#xff0c;访问是成功的 http://localhost/blogkjh/public/article 但是在linux服务器上访问显示404 not found 但是我在服务器上使用 php artisan serve --host 0.0.0.0 命令 却可以访问 甚至连swagger都可以访问 关于这个我最近就特别疑…

Visual Studio 2017 15.6版本预览,增加新功能

上周Visual Studio 2017 15.5 版本已正式发布&#xff0c;同时发布的还有 Visual Studio for Mac 7.3 。 Visual Studio 2017 15.6 版本预览&#xff0c;这个最新的预览包含新功能&#xff0c;生产力改进和其他增强功能&#xff0c;以解决客户的反馈意见。 本发行版中的更新摘要…

使用 mono 编译 .NET Standard 应用

微软发布 .NET Standard 2.0 已经有一段时间了&#xff0c; 根据 .NET Standard 2.0 支持版本的文档&#xff0c; Mono 5.4 是支持 .NET Standard 2.0 的&#xff0c; 对于 .NET Standard 2.0 应用的开发的介绍&#xff0c; 几乎全部都是在 Windows 系统下使用 Visual Studio 2…

Spring Boot 热部署入门

转载自 Spring Boot 热部署入门 1. 概述 在日常开发中&#xff0c;我们需要经常修改 Java 代码&#xff0c;手动重启项目&#xff0c;查看修改后的效果。如果在项目小时&#xff0c;重启速度比较快&#xff0c;等待的时间是较短的。但是随着项目逐渐变大&#xff0c;重启的速…

微服务架构的理论基础 - 康威定律

摘要&#xff1a; 可能出乎很多人意料之外的一个事实是&#xff0c;微服务很多核心理念其实在半个世纪前的一篇文章中就被阐述过了&#xff0c;而且这篇文章中的很多论点在软件开发飞速发展的这半个世纪中竟然一再被验证&#xff0c;这就是康威定律。前段时间看了Mike Amundsen…

阿里微服务架构下分布式事务Seata

转载自 阿里微服务架构下分布式事务Seata Seata 是什么&#xff1f; Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前&#xff0c;Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一…

用于.NET Core的ORM

尽管EF Core正努力提供视图和存储过程等基本数据库特性&#xff0c;但是开发人员也在寻求能满足他们数据访问需求的ORM工具。下面列出一些相对广为使用的ORM。 LLBLGen Pro Runtime Framework LLBLGen Pro Runtime Framework是一种“可选”的ORM&#xff0c;它是与LLBLGen实体建…

Spring Boot之基于Dubbo和Seata的分布式事务解决方案

转载自 Spring Boot之基于Dubbo和Seata的分布式事务解决方案 1. 分布式事务初探 一般来说&#xff0c;目前市面上的数据库都支持本地事务&#xff0c;也就是在你的应用程序中&#xff0c;在一个数据库连接下的操作&#xff0c;可以很容易的实现事务的操作。但是目前&#xff…

Ocelot监控

网关的作用之一&#xff0c;就是有统一的数据出入口&#xff0c;基于这个功能&#xff0c;我们可以在网关上配置监控&#xff0c;从而把所有web服务的请求应答基本数据捕获并展显出来。 关于web的监控&#xff0c;一般的做法是采集数据并保存&#xff0c;然后通过图表的方式展示…

Spring Boot之基于Redis实现MyBatis查询缓存解决方案

转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架&#xff0c;笔者目前在实际的开发中&#xff0c;也在使用MyBatis。本文主要介绍了MyBatis的缓存策略、以及基于SpringBoot和Redis实现MyBatis的二级缓存的过程。实现本…

数据库架构演变概要

一&#xff0e;背景为了适应业务增长,数据库数据量快速增长&#xff0c;性能日趋下降&#xff0c;稳定性不佳的实际情况&#xff0c;急需架构逐步演变适应未来的业务发展。二&#xff0e;现状【稳定性】数据库为单点&#xff0c;没有高可用和稳定性方案。【数据量大】数据库目前…

面试请不要再问我Spring Cloud底层原理

转载自 面试请不要再问我Spring Cloud底层原理 概述 毫无疑问&#xff0c;Spring Cloud是目前微服务架构领域的翘楚&#xff0c;无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面&#xff0c;其底层的很多原理&#xff0c;很多人可能并…

nginx配置前端反向代理

本地这里有两个端口&#xff1a; 8080&#xff1a;前端页面 80&#xff1a;后端接口 在nginx配置 listen 8888;server_name 127.0.0.1;location / {root html;proxy_pass http://127.0.0.1:8080;# try_files $uri $uri/ /index.php$is_args$args;index index.html…

Visual Studio 2017的第五个更新包扩展了调试工具

Visual Studio 2017近日收到了最新的完整更新包&#xff0c;版本号为15.5。跟随前几次更新的步伐&#xff0c;这次发布提供了一系列几乎会让所有用户从中受益的特性。此次发布的一个重点是IDE的性能&#xff0c;尤其是减少C#/Visual Basic项目的加载时间。在.NET Core项目中进行…