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

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

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

相关文章

【Java基础题型】遍历1000以内的完数

一个数如果恰好等于不包含它本身所有因子之和&#xff0c;这个数就称为"完数"。 例如&#xff0c;6的因子为1、2、3&#xff0c;而6123&#xff0c;因此6是"完数"。 编程序找出N之内的所有完数&#xff0c;并按下面格式输出其因子 输入格式 N 输出格式( …

研究下福克斯的油耗

1.分析 09款1.8MT福克斯的真实油耗 https://zhidao.baidu.com/question/107309076 发改委的是匀速油耗 如果单纯是在市区行驶&#xff0c;还要看路况&#xff0c;经常塞车&#xff0c;红绿灯多等等&#xff0c;这样油耗就高了&#xff0c;一百公里起码10-11升 如果是在高速行…

推荐学习什么编程语言?

选择编程语言学习时&#xff0c;除了就业因素外&#xff0c;还可以考虑以下几个方面来决定学习哪些编程语言&#xff1a; 个人兴趣与目标&#xff1a;如果你对某个特定领域感兴趣&#xff0c;比如游戏开发、数据分析、人工智能等&#xff0c;可以选择与该领域紧密相关的编程语言…

Altair® Access™ 面向研究人员和工程师的 HPC 作业提交门户

Altair Access™ 面向研究人员和工程师的 HPC 作业提交门户 Access 具有一个简单、强大且统一的界面&#xff0c;可以从中提交和监控远程集群、云或其他资源的相关作业&#xff0c;使工程师和研究人员能够专注于主要活动&#xff0c;减少在应用程序运行及数据移动上投入的时间。…

搭建第一个Web服务器(在eclipse或idea上部署Tomcat服务器)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

二维数组得学习

二维数组可以看作是一维数组的扩展&#xff0c;其元素本身又是一维数组。具体来说&#xff0c;一个m行n列的二维数组&#xff0c;既可以视为由m个一维数组&#xff08;行&#xff09;所组成的线性表&#xff0c;也可以视为由n个一维数组&#xff08;列&#xff09;所组成的线性…

算法练习第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV 123.买卖股票的最佳时机III class Solution {public int maxProfit(int[] prices) {//dp[i][j] 第i天买卖股票获得的最大利润/**j0不操作j1第一次持有j2第一次不持有j3第二次持有j4第二次不持有dp[i][0] dp[i-1][0]d…

518. 零钱兑换 II(力扣LeetCode)

文章目录 518. 零钱兑换 II题目描述动态规划一维数组为什么不能交换两个for循环的顺序&#xff1f; 二维数组 518. 零钱兑换 II 题目描述 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数…

2024年ERP软件上中下游结构分析及细分行业研究

环洋咨询Global Info Research的ERP软件市场调研报告提供ERP软件市场的基本概况&#xff0c;包括定义&#xff0c;分类&#xff0c;应用和产业链结构&#xff0c;同时还讨论发展政策和计划以及制造流程和成本结构&#xff0c;分析ERP软件市场的发展现状与未来市场趋势&#xff…

nandgame中的条件判断EQ(== 相等)、GT、LT、NOT、GOTO、IF_GOTO

相等从堆栈中弹出两个顶部值并进行比较。 如果它们相等&#xff0c;则推送值-1&#xff08;十六进制中的FFFF&#xff09;。 否则推送0。在条件语句中&#xff0c;FFFF代表真&#xff0c;0代表假。示例 之前 之后 堆栈 堆栈 7 0 8 结果如下&#xff1a; 代码 POP_D POP_A…

AI大模型探索之路-应用篇8:Langchain框架LangServe模块-专注于AI模型的部署

目录 前言 一、概述 二、功能特性 三、REST API 开发 四、Postman调用测试 五、Client调用测试 总结 前言 随着AI大语言模型&#xff08;LLM&#xff09;的技术的不断演进&#xff0c;AI应用的开发和部署变得越来越复杂。在这样的背景下&#xff0c;LangServe应运而生—…

设计模式——2_7 状态(State)

欲买桂花同载酒&#xff0c;终不似&#xff0c;少年游 ——刘过《唐多令芦叶满汀州》 文章目录 定义图纸一个例子&#xff1a;如何模拟一个转笔刀自动转笔刀PencilPencilSharpener 投诉和改善钝刀BladePencilSharpener 没有铅笔PencilSharpener if if ifStatePencilSharpener 碎…

python 读取文件内容每一行,写入另一个文件内

场景 想要利用 python 读取指定文件的中的内容&#xff0c;格式自行解析&#xff0c;然后将读取到的内容整理后再写入另一个文件中 步骤 读取文件将读取出来的每一行内容自定义修改一下将修改后的内容写入到另一个文件中 本地测试代码 # 打开源文件并读取其内容 with open…

48-基于腾讯云EKS的容器化部署实战

准备工作 在部署IAM应用之前&#xff0c;我们需要做以下准备工作&#xff1a; 开通腾讯云容器服务镜像仓库。安装并配置Docker。准备一个Kubernetes集群。 开通腾讯云容器服务镜像仓库 在Kubernetes集群中部署IAM应用&#xff0c;需要从镜像仓库下载指定的IAM镜像&#xff…

亚马逊、速卖通、lazada测评自养号与机刷有何区别?

在亚马逊平台&#xff0c;买家评价的重要性无需多言。许多消费者在决定购买产品前&#xff0c;都会习惯性地查看相关评论&#xff0c;对比同类产品的买家反馈&#xff0c;从而做出更明智的选择。正因如此&#xff0c;测评成为各大电商平台不可或缺的一种推广策略&#xff0c;亚…

蓝桥杯备考day3

1.1 DFS模板&#xff08;深度优先遍历&#xff09; 模板 全局状态变量 void dfs(当前状态) {if(当前状态是目标状态) // 判断进行相应处理&#xff08;输出当前解、更新最优解、退出返回等&#xff09;// 扩展for(所有可行的新状态){if(新状态没有访问过 && 需要访问…

C++ 模拟实现 STL 中的 set、map 与 multiset、multimap

目录 一&#xff0c;RB_tree 的实现 1&#xff0c;RB_tree 的节点与数据结构 2&#xff0c;RB_tree 的迭代器 3&#xff0c;RB_tree 的构造 4&#xff0c;RB_tree 的元素操作 5&#xff0c;完整代码 二&#xff0c;set 与 multiset 的实现 1&#xff0c;set 2&#x…

从零开始:Elasticsearch简介与详解

大家好,我是小米,今天我来和大家聊一聊阿里巴巴面试题中常见的一个话题:Elasticsearch。作为一名喜欢分享技术的小伙伴,我深知在技术的道路上,多一份了解就多一份优势。那么,让我们一起来探索一下Elasticsearch的特点、功能、场景以及与竞品的对比分析吧! 特点 特点是…

js爬虫puppeteer库 解决网页动态渲染无法爬取

我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来&#xff0c;是因为这个网页这里是实时渲染的&#xff0c;我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …

1. VirtualBox安装CentOS

安装 VirtualBox 地址:https://www.virtualbox.org/wiki/Downloads 版本: 6.1和7.0+版本都可以 安装: windows上安装需要admin权限,右键菜单选中 “Run as administrator” 安装 CentOS 6.10 地址:https://vault.centos.org/6.10/isos/x86_64/ 版本: 如果不需要GUI,选择…