百度OCR身份证识别C++离线SDKV3.0 C#对接

news2025/2/28 17:47:28

 百度OCR身份证识别C++离线SDKV3.0 C#对接

目录

说明

效果

问题 

项目

代码

下载


说明

自己根据SDK封装了动态库,然后C#调用。

SDK 简介

        本 SDK 适应于于 Windows 平台下的⾝份证识别系统,⽀持 C++接⼜开发的 SDK,开发者可在VS2015 下⾯进⾏开发(推荐使⽤,不保证其他版本 VS 都兼容)。SDK 采⽤ C++的动态库 DLL 的⽅式,另外随 SDK 附带⼀个鉴权激活⼯具(LicenseTool.exe,在license_tool ⽬录),通过该激活⼯具可⽣成正常接 ⼊SDK 的激活 license ⽂件 license.zip(解压后可⽣成两个⽂件 license.ini 和license.key)达到通过鉴权, 正常使⽤SDK 的⽬的。

激活工具授权

        鉴权采⽤ SDK 附带的鉴权⼯具 LicenseTool.exe、双击打开 exe 后,输⼊申请获取到的授权序列号,执⾏按钮激活后会⽣成⼀个 license.zip ⽂件,把这个⽂件解压后会⽣成 license.ini 和 license.key两个⽂件,把这 2 个⽂件放置到 SDK 的 license ⽂件夹,即可通过授权激活。另外⽀持鉴权⽂件路径定制化及模型⽂件路径定制化,可参考 SDK 示例(鉴权⽂件 license.key 和 license.ini 的路径可参考SDK 代码示例,也可以⽤ SDK 现成的默认路径)。鉴权⼯具 LicenseTool.exe 如下所示,在⼯具中输⼊申请得到的 license 系列号即可⽣成鉴权 zip ⽂件。解压 zip 后可⽣成 license.ini 和 license.key 两个⽂件。

SDK包结构

效果

问题 

返回的坐标位置有问题,猜测可能是内部缩放了图片导致,后续等官方修复。

项目

代码

using Newtonsoft.Json;
using OpenCvSharp;
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using WinFormTest.Common;

namespace WinFormTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        IntPtr IDCard;
        int res = -1;

        private void Form1_Load(object sender, EventArgs e)
        {
            IDCard = Native.create();

            string key = "";
            string licenseKeyPath = Application.StartupPath + "\\license\\license.key";
            string licenseFile = Application.StartupPath + "\\license\\license.ini";
            key = File.ReadAllText(licenseKeyPath);

            res = Native.auth_from_file(IDCard, key, licenseFile, false);

            string model_folder = Application.StartupPath + "\\resource";
            res = Native.sdk_init(IDCard, model_folder);

            image_path = Application.StartupPath + "\\idcard_.jpg";
            pictureBox1.Image = new Bitmap(image_path);
        }

        private void button1_Click(object sender, EventArgs e)
        {

            if (image_path == "")
            {
                return;
            }

            textBox1.Text = "";
            Application.DoEvents();

            Mat image = new Mat(image_path);

            StringBuilder ocr_result1 = new StringBuilder(1024);
            StringBuilder ocr_result2 = new StringBuilder(2048);
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            res = Native.ocr2(IDCard, image.CvPtr, ocr_result1, ocr_result2);
            string s = ocr_result1.ToString();
            string s2 = ocr_result2.ToString();
            stopwatch.Stop();
            double totalTime = stopwatch.Elapsed.TotalSeconds;
            textBox1.Text += $"耗时: {totalTime:F2}s";
            textBox1.Text += "\r\n-------------------\r\n";

            if (res == 0)
            {
                Object jsonObject = JsonConvert.DeserializeObject(ocr_result1.ToString());
                textBox1.Text += JsonConvert.SerializeObject(jsonObject, Newtonsoft.Json.Formatting.Indented);

                textBox1.Text += "\r\n-------------------\r\n";

                Object jsonObject2 = JsonConvert.DeserializeObject(ocr_result2.ToString());
                textBox1.Text += JsonConvert.SerializeObject(jsonObject2, Newtonsoft.Json.Formatting.Indented);

                IDCardRes iDCardResponse = JsonConvert.DeserializeObject<IDCardRes>(ocr_result1.ToString());
                IDCardCoordRes iDCardCoordResponse = JsonConvert.DeserializeObject<IDCardCoordRes>(ocr_result2.ToString());

                //if (iDCardResponse.name == "") iDCardCoordResponse.name_coord = "";
                //if (iDCardResponse.gender == "") iDCardCoordResponse.gender_coord = "";
                //if (iDCardResponse.ethnicity == "") iDCardCoordResponse.ethnicity_coord = "";
                //if (iDCardResponse.birth == "") iDCardCoordResponse.birth_coord = "";
                //if (iDCardResponse.address == "") iDCardCoordResponse.address_coord = "";
                //if (iDCardResponse.id_number == "") iDCardCoordResponse.id_number_coord = "";
                //if (iDCardResponse.authority == "") iDCardCoordResponse.authority_coord = "";
                //if (iDCardResponse.issuing_date == "") iDCardCoordResponse.issuing_date_coord = "";
                //if (iDCardResponse.expiry_date == "") iDCardCoordResponse.expiry_date_coord = "";

                if (iDCardResponse.name != "")
                {
                    DrawRes(image, iDCardCoordResponse.name_coord);
                }
                if (iDCardResponse.gender != "")
                {
                    DrawRes(image, iDCardCoordResponse.gender_coord);
                }
                if (iDCardResponse.ethnicity != "")
                {
                    DrawRes(image, iDCardCoordResponse.ethnicity_coord);
                }
                if (iDCardResponse.birth != "")
                {
                    DrawRes(image, iDCardCoordResponse.birth_coord);
                }
                if (iDCardResponse.address != "")
                {
                    DrawRes(image, iDCardCoordResponse.address_coord);
                }
                if (iDCardResponse.id_number != "")
                {
                    DrawRes(image, iDCardCoordResponse.id_number_coord);
                }
                if (iDCardResponse.authority != "")
                {
                    DrawRes(image, iDCardCoordResponse.authority_coord);
                }
                if (iDCardResponse.issuing_date != "")
                {
                    DrawRes(image, iDCardCoordResponse.issuing_date_coord);
                }
                if (iDCardResponse.expiry_date != "")
                {
                    DrawRes(image, iDCardCoordResponse.expiry_date_coord);
                }

                if (pictureBox1.Image != null)
                {
                    pictureBox1.Image.Dispose();
                    pictureBox1.Image = null;
                }

                pictureBox1.Image = new Bitmap(image.ToMemoryStream());
                image.Dispose();
            }
            else
            {
                textBox1.Text = "识别失败";
            }


        }

        void DrawRes(Mat res_image, string ptsStr)
        {
            string[] pts = ptsStr.Split(' ');
            //多边形的顶点
            OpenCvSharp.Point[] points = new OpenCvSharp.Point[]
            {
                new OpenCvSharp.Point(Convert.ToDouble( pts[0]), Convert.ToDouble( pts[1])),
                new OpenCvSharp.Point(Convert.ToDouble( pts[2]), Convert.ToDouble( pts[3])),
                new OpenCvSharp.Point(Convert.ToDouble( pts[4]), Convert.ToDouble( pts[5])),
                new OpenCvSharp.Point(Convert.ToDouble( pts[6]), Convert.ToDouble( pts[7])),
            };
            // 绘制多边形
            Cv2.Polylines(res_image, new OpenCvSharp.Point[][] { points }, isClosed: true, color: new Scalar(0, 255, 0), thickness: 3);
        }

        void DrawRes2(Mat res_image, float[] pts)
        {
            //多边形的顶点
            OpenCvSharp.Point[] points = new OpenCvSharp.Point[]
            {
                new OpenCvSharp.Point(pts[0], pts[1]),
                new OpenCvSharp.Point(pts[2], pts[3]),
                new OpenCvSharp.Point(pts[4], pts[5]),
                new OpenCvSharp.Point(pts[6], pts[7]),
            };
            // 绘制多边形
            Cv2.Polylines(res_image, new OpenCvSharp.Point[][] { points }, isClosed: true, color: new Scalar(0, 255, 0), thickness: 3);
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            pictureBox1.Image = null;
            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            textBox1.Text = "";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (image_path == "")
            {
                return;
            }

            textBox1.Text = "";
            Application.DoEvents();

            Mat image = new Mat(image_path);
            IDCardResponse final_result = new IDCardResponse();
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            res = Native.ocr(IDCard, image.CvPtr, ref final_result);
            stopwatch.Stop();
            double totalTime = stopwatch.Elapsed.TotalSeconds;
            textBox1.Text += $"耗时: {totalTime:F2}s";
            textBox1.Text += "\r\n-------------------\r\n";

            IDCardRes iDCardResponse = new IDCardRes();
            iDCardResponse.name = Encoding.UTF8.GetString(final_result.name).Replace("\u0000", "");
            iDCardResponse.gender = Encoding.UTF8.GetString(final_result.gender).Replace("\u0000", "");
            iDCardResponse.ethnicity = Encoding.UTF8.GetString(final_result.ethnicity).Replace("\u0000", "");
            iDCardResponse.birth = Encoding.UTF8.GetString(final_result.birth).Replace("\u0000", "");
            iDCardResponse.address = Encoding.UTF8.GetString(final_result.address).Replace("\u0000", "");
            iDCardResponse.id_number = Encoding.UTF8.GetString(final_result.id_number).Replace("\u0000", "");
            iDCardResponse.authority = Encoding.UTF8.GetString(final_result.authority).Replace("\u0000", "");
            iDCardResponse.issuing_date = Encoding.UTF8.GetString(final_result.issuing_date).Replace("\u0000", "");
            iDCardResponse.expiry_date = Encoding.UTF8.GetString(final_result.expiry_date).Replace("\u0000", "");

            textBox1.Text += JsonConvert.SerializeObject(iDCardResponse, Newtonsoft.Json.Formatting.Indented);
            textBox1.Text += "\r\n-------------------\r\n";

            IDCardCoordRes2 iDCardCoordRes2 = new IDCardCoordRes2();
            iDCardCoordRes2.name_coord = final_result.name_coord;
            iDCardCoordRes2.gender_coord = final_result.gender_coord;
            iDCardCoordRes2.birth_coord = final_result.birth_coord;
            iDCardCoordRes2.address_coord = final_result.address_coord;
            iDCardCoordRes2.id_number_coord = final_result.id_number_coord;
            iDCardCoordRes2.ethnicity_coord = final_result.ethnicity_coord;
            iDCardCoordRes2.authority_coord = final_result.authority_coord;
            iDCardCoordRes2.issuing_date_coord = final_result.issuing_date_coord;
            iDCardCoordRes2.expiry_date_coord = final_result.expiry_date_coord;

            textBox1.Text += JsonConvert.SerializeObject(iDCardCoordRes2, Newtonsoft.Json.Formatting.Indented);

            DrawRes2(image, iDCardCoordRes2.name_coord);
            DrawRes2(image, iDCardCoordRes2.gender_coord);
            DrawRes2(image, iDCardCoordRes2.birth_coord);
            DrawRes2(image, iDCardCoordRes2.address_coord);
            DrawRes2(image, iDCardCoordRes2.id_number_coord);
            DrawRes2(image, iDCardCoordRes2.ethnicity_coord);
            DrawRes2(image, iDCardCoordRes2.authority_coord);
            DrawRes2(image, iDCardCoordRes2.issuing_date_coord);
            DrawRes2(image, iDCardCoordRes2.expiry_date_coord);

            if (pictureBox1.Image != null)
            {
                pictureBox1.Image.Dispose();
                pictureBox1.Image = null;
            }

            pictureBox1.Image = new Bitmap(image.ToMemoryStream());
            image.Dispose();
        }
    }
}

下载

C++封装源码下载

C#调用源码下载

SDK下载

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

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

相关文章

基于FPGA的HDMI设计导航页面

FPGA使用HDMI更多时候用于传输图像数据&#xff0c;并不会传输音频数据&#xff0c;因此以下文章均采用DVI接口协议&#xff0c;HDMI与DVI的视频传输协议基本一致&#xff0c;区别也很小。 首先需要了解HDMI的来源&#xff0c;以及物理接口类型以及引脚信号&#xff0c;最后对几…

网站SEO关键词规划时如何筛选出合适的关键词?

在网站SEO优化过程中&#xff0c;关键词布局是一个至关重要的环节。首先&#xff0c;我们需要确定核心关键词&#xff0c;然后通过各种策略和方法对关键词进行扩展。完成关键词扩展后&#xff0c;接下来的任务就是对这些扩展后的关键词进行筛选。那么&#xff0c;如何进行有效的…

day02 51单片机

51单片机学习 1闪烁LED 1.1 需求描述 这个案例,我们要让P00引脚对应的LED按照1秒闪烁1次。 1.2 硬件设计 1.1 软件设计 1)LED闪烁的代码 想让LED闪烁,就需要P00的值不断在0和1之间循环变化。实现这一功能的代码也很简单: #include <STC89C5xRC.H> //包含STC89…

在线预约小程序怎么做

在快节奏的现代生活中&#xff0c;无论是预约理发、还是预定餐厅&#xff0c;亦或是挂号就医&#xff0c;我们都希望有一个更加便捷、高效的方式来完成这些任务。而今&#xff0c;随着科技的发展&#xff0c;一款全新的在线预约小程序应运而生&#xff0c;为我们的生活带来了前…

SOCKS代理是如何增强网络隐私?

在数字化时代&#x1f310;&#xff0c;网络隐私的重要性日益凸显。个人和组织都在寻找有效的方法来保护自己的网络活动不受侵犯。SOCKS代理作为一种流行的网络协议&#xff0c;提供了一种有效的手段来增强网络隐私。本文将详细介绍SOCKS代理是如何工作的&#xff0c;以及它是如…

【随笔】Git 高级篇 -- 本地栈式提交 rebase | cherry-pick(十七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

不允许在constexpr函数中进行声明

这是我用pycharm在windows系统下复现sfm深度学习网络(Deep Two-View Structure-from-Motion Revisited&#xff09;遇见的问题&#xff0c;复现时有段代码pytorch扩展cuda/c&#xff0c;pycharm中出现C标准相关的报错如下&#xff1a; 在网上查找很久无果&#xff0c;后面通过…

局域网tcp通信实验

两台windows系统计算机简单TCP通信测试_两台计算机tcp通信-CSDN博客 使用这篇文章的小工具。 环境&#xff1a; 我和同学的两台笔记本电脑。 使用我的手机开热点&#xff0c;两台电脑连接热点。 我的&#xff1a; IPv4 地址 . . . . . . . . . . . . : 192.168.92.79 子…

码农必看:常见源代码混淆技术详解

背景 一、项目组代码部署存在的问题 在项目组中&#xff0c;核心代码模块被部署于用户服务器上。然而&#xff0c;另一家公司获取了该服务器的root密码&#xff0c;这就存在着潜在的数据泄露和代码泄露的风险。传统的解决方法是通过配置环境变量来进行数据库加密处理&#xf…

全国项目管理标准化技术委员会副秘书长肖杨先生受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 全国项目管理标准化技术委员会副秘书长、微薄之力&#xff08;北京&#xff09;管理咨询有限公司董事长肖杨先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“数字化时代下&#xff0c;由职能型组织向高度适应性组织转…

免费的GPT-3.5 API服务aurora

什么是 aurora &#xff1f; aurora 是利用免登录 ChatGPT Web 提供的无限制免费 GPT-3.5-Turbo API 的服务&#xff0c;支持使用 3.5 的 access 调用。 【注意】&#xff1a;仅 IP 属地支持免登录使用 ChatGPT的才可以使用&#xff08;也可以自定义 Baseurl 来绕过限制&#x…

03-JAVA设计模式-装饰模式

装饰模式 什么装饰模式 装饰器模式&#xff08;Decorator Pattern&#xff09;也叫包装器模式&#xff0c;是一种结构型设计模式&#xff0c;允许用户在不改变对象的情况下&#xff0c;动态地给对象增加一些额外的职责&#xff08;功能&#xff09;。装饰器模式相比生成子类更…

【重磅福利】智慧餐饮互联网餐饮行业分析数字化报告大合集共40份(免费下载)

【1】关注本公众号 【2】私信发送 智慧餐饮报告合集 【3】获取本方案合集的下载链接&#xff0c;直接下载即可。

前端学习<四>JavaScript基础——15-内置对象 String:字符串的常见方法

内置对象简介 JavaScript 中的对象分为3种&#xff1a;自定义对象、内置对象、浏览器对象。 前面两种对象&#xff1a;是JS的基础内容&#xff0c;属于 ECMAScript&#xff1b; 第三个浏览器对象&#xff1a;属于JS独有&#xff0c;即 JS 内置的API。 内置对象&#xff1a;就是…

为什么大模型训练都需要GPU?现在都有哪些合适的GPU适合训练大模型?价格如何?

大家有没有这样的疑问&#xff0c;为什么大模型训练需要的是GPU&#xff0c;而不是CPU&#xff0c;而现在市面上&#xff0c;有哪些适合训练的GPU型号&#xff0c;价格如何&#xff1f;下面让我来一一给大家进行介绍。 为什么大模型训练需要GPU&#xff0c;而非CPU&#xff1f;…

设计模式——责任链模式13

责任链模式 每个流程或事物处理 像一个链表结构处理。场景由 多层部门审批&#xff0c;问题分级处理等。下面体现的是 不同难度的问题由不同人进行解决。 设计模式&#xff0c;一定要敲代码理解 传递问题实体 /*** author ggbond* date 2024年04月10日 07:48*/ public class…

Proteus与Multisim哪款更适合51单片机仿真?

选择使用Proteus或Multisim进行51单片机仿真&#xff0c;取决于用户的具体需求、个人偏好以及软件的特点。以下是关于这两款软件的对比分析&#xff1a; 功能和特性 Proteus是一款功能强大的电路设计和仿真软件&#xff0c;它支持多种单片机和微控制器的仿真&#xff0c;包括51…

最新小红书店铺开店带货教程,新手也能跑通全流程(6节课+爆款公式)

爆款标题公式 一、0粉丝个人开店适合哪些赛道,mp4 二、小红书起号爆款逻辑,mp4 三、如何找爆款选题蹭热点.mp4 四、抖音一件代发怎么操作,mp4 五、1688一件代发怎么操作,mp4 六、顾客退货怎么办,mp4 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qe…

基于java+springboot+vue实现的售楼管理系统(文末源码+Lw)23-255

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本售楼管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

未提交事务直接返回,导致连接池资源耗尽

错误分析&#xff1a; 我所撰写的代码如下&#xff0c;在使用编程式事务的时候&#xff0c;我未提交或回滚事务就直接返回&#xff0c;因为连接池默认连接数的大小是10&#xff0c;所以到第十一次的时候连接池就会使用完&#xff0c;导致任务无法进行。 Autowired private Ns…