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

 百度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下载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫+RPC+js逆向---直接获取加密值

免责声明:本文仅做技术交流与学习,请勿用于其它违法行为;如果造成不便,请及时联系... 目录 爬虫RPCjs逆向---直接获取加密值 target网址: 抓包 下断点 找到加密函数 分析参数 RPC流程 一坨: 二坨: 运行py,拿到加密值 爬虫RPCjs逆向---直接获取加密值 target网址: 优志…

Django+Celery框架自动化定时任务开发

本章介绍使用DjCelery即DjangoCelery框架开发定时任务功能&#xff0c;在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化测试脚本、App自动化测试脚本、Web自动化测试脚本等任务的定时执行、调度、管理等&#xff0c;从而取代Jenkins上的定时执行脚本和发送…

R语言复现:轨迹增长模型发表二区文章 | 潜变量模型系列(2)

培训通知 Nhanes数据库数据挖掘&#xff0c;快速发表发文的利器&#xff0c;你来试试吧&#xff01;欢迎报名郑老师团队统计课程&#xff0c;4.20直播。 案例分享 2022年9月&#xff0c;中国四川大学学者在《Journal of Psychosomatic Research》&#xff08;二区&#xff0c;I…

南京航空航天大学-考研科目-513测试技术综合 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分

系列文章目录 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分 文章目录 系列文章目录前言总结 前言 单片机的基础内容繁杂&#xff0c;有很多同学基础不是很好&#xff0c;对一些细节也没有很好的把握。非常推荐大家去学习一下b站上的哈工大 单片机原理及…

AI大模型引领未来智慧科研暨ChatGPT自然科学高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

大数据基础学习

目录 一.什么是大数据二.数据处理技术分类&#xff08;OLAP vs OLTP&#xff09;OLAP&#xff08;Online Analytical Processing&#xff09;OLTP&#xff08;Online Transaction Processing&#xff09;区别联系 三.储存的方式&#xff08;列式 vs 行式&#xff09;行式存储列…

【Vue】webpack polyfilling 报错

1. 出现问题描述 npm run serve 项目时报错 ERROR Failed to compile with 1 error 10:33:22 ├F10: AM┤ error in ./src/router/routes.js Module not found: Error: Cant resolve path in /U…

Harmony鸿蒙南向驱动开发-SDIO

SDIO&#xff08;Secure Digital Input and Output&#xff09;由SD卡发展而来&#xff0c;与SD卡统称为MMC&#xff08;MultiMediaCard&#xff09;&#xff0c;二者使用相同的通信协议。SDIO接口兼容以前的SD卡&#xff0c;并且可以连接支持SDIO接口的其他设备。 运作机制 …

Vue的学习之旅-part6-循环的集中写法与ES6增强语法

Vue的学习之旅-循环的集中写法与ES6增强语法 vue中的几种循环写法for循环for in 循环 for(let i in data){}for of 循环 for(let item of data){}reduce() 遍历 reduce( function( preValue, item){} , 0 ) ES6增强写法 类似语法糖简写对象简写函数简写 动态组件中使用 <kee…

MySQL 主从复制部署(8.0)

什么是主从数据库 主从数据库是一种数据库架构模式&#xff0c;通常用于提高数据库的性能、可用性和可伸缩性。 它包括两种类型的数据库服务器&#xff1a; 1&#xff09;主数据库&#xff08;Master&#xff09;&#xff1a;主数据库是读写数据的主要数据库服务器。所有写操…

【数据结构】单链表(一)

上一篇【数据结构】顺序表-CSDN博客 我们了解了顺序表&#xff0c;但是呢顺序表涉及到了一些问题&#xff0c;比如&#xff0c;中间/头部的插入/删除&#xff0c;时间复杂度为O(N);增容申请空间、拷贝、释放旧空间会有不小的消耗&#xff1b;增容所浪费的空间... 我们如何去解…

IOS虚拟键盘弹出后,弹窗的按钮点击不起作用,不会触发click事件

背景 讨论区项目的回复框&#xff0c;使用的是Popup和TextArea做&#xff0c;布局如下图&#xff0c;希望键盘弹出时候&#xff0c;回复框可以紧贴键盘&#xff0c;这点实现起来比较简单&#xff0c;监听resize事件&#xff0c;动态修改popup的这题内容的top值即可&#xff0c…

ONERugged车载平板电脑厂家丨工业车载电脑优势体现丨3年质保

作为现代社会中必不可少的出行工具&#xff0c;汽车不仅仅是代步工具&#xff0c;更是我们生活中的重要一部分。而在如此多功能的汽车内&#xff0c;一款高可靠性、适应不同行业应用的车载平板电脑成为了当下的热门选择。ONERugged车载平板电脑以其卓越的品质和强大的功能而备受…

自动化 单元测试Test

XCTest测试框架(单元测试XCTests、性能测试XCPPerformanceTests、用户界面测试XCUItests) 单元测试XCTests&#xff1a;测试应用中事件或逻辑是否预期工作。 用户界面测试XCUItests&#xff1a;测试用户与应用的UI交互(如点击按钮、滑动屏幕)。 性能测试XCPPerformanceTests&am…

电池电量监测系统设计 单片机+LabVIEW+Matlab+Protues+Keil程序

目录 前言 提供 软件 系统展示 1.放电试验及其处理 2.硬件系统原理图 3.下位机程序 4.显示 5.上位机界面 6.上位机程序 7.文档 资料下载地址&#xff1a;电池电量监测系统设计 单片机LabVIEWMatlabProtuesKeil程序 前言 这套系统首先使用Matlab分析获得了电压…

【opencv】示例-essential_mat_reconstr.cpp 从两幅图像中恢复3D场景的几何信息

导入OpenCV的calib3d, highgui, imgproc模块以及C的vector, iostream, fstream库。定义了getError2EpipLines函数&#xff0c;这个函数用来计算两组点相对于F矩阵&#xff08;基础矩阵&#xff09;的投影误差。定义了sgn函数&#xff0c;用于返回一个双精度浮点数的符号。定义了…

系统架构设计图

首先明确应用架构的定义&#xff0c;从百度百科上即可了解到何为应用架构&#xff1a; 应用架构&#xff08;Application Architecture&#xff09;是描述了IT系统功能和技术实现的内容。应用架构分为以下两个不同的层次&#xff1a; 企业级的应用架构&#xff1a;企业层面的应…

git bash用法-批量修改文件名

在win系统上安装git bash可以使用命令行模式操作&#xff0c;比较方便 1.原始文件名 2.代码 for file in *3utr*; do mv "$file" "$(echo "$file" | sed s/3utr/5utr/)"; done3.修改后的文件名

基于FPGA的HDMI设计导航页面

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

自动化测试-web(弹窗/滚动条/鼠标/等待等操作)

一、弹窗 为什么要处理弹窗&#xff1f; 如果页面操作过程中&#xff0c;有弹窗出现&#xff0c;不处理&#xff0c;无法继续对页面操作。 弹窗类型&#xff1a; js原生弹窗&#xff1a; 警告框、输入框、提示框&#xff0c;这些必须处理 如何处理&#xff1a; 1&#xff0…