C++ OCR证件照文字识别

news/2024/12/19 20:56:11/

 一.引言

文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技术的发展,文字识别技术已经成为信息管理、自动化办公和智能系统的关键组成部分。

二.简介

为了易于集成和使用,我们将文字识别OCR封装为DLL(动态链接库)。这种封装方式不仅保留了算法的性能优势,还提供了跨平台和跨语言的兼容性,目前支持编程语言如下:

  • C++
  • Python
  • 易语言

1.C++头文件

#ifndef __SN_OCR__H__
#define __SN_OCR__H__#include "windows.h"//返回参数
typedef struct SN_STATU {int code;			//错误码,如果为 0 表示成功,否则表示错误号char message[4096];	//错误信息,如果为 "OK" 表示成功,否则返回错误信息}SN_STATU;/*启动OCR文字识别服务
*
* 参数:
*	[in]  szOnnxFilePath:	设置 onnx 模型文件路径,如果设置为 NULL,默认和 DLL文件同级目录
* 	[out] pResult:			返回错误信息,参数pResult->code(错误码)如果为 0 表示成功,否则表示错误号;
*
* 返回值:成功返回0,失败返回错误号,详细错误信息请参考 pResult
*
*/
int WINAPI apiSNInitOCRServer(char* szOnnxFilePath, SN_STATU* pStatu);/*创建OCR文字识别句柄
*
* 参数:
*	[in]  szKey:		卡密(购买卡密:https://shop.4yuns.com/links/7C9F16B7)
* 	[in]  pOnnxFilePath:设置 onnx 模型文件路径,如果设置为 NULL,默认和 DLL文件同级目录
* 	[out] pResult:		返回错误信息,参数pResult->code(错误码)如果为 0 表示成功,否则表示错误号;
*
* 返回值:成功返回句柄,失败返回NULL
*
*/
HANDLE WINAPI apiSNCreateOCRHandle(char* szKey, char* szOnnxFilePath, SN_STATU* pStatu);/*获取OCR文字识别卡密到期时间
*
* 参数:
*	[in]  handle:		句柄(通过调用apiSNCreateOCRHandle得到)
* 	[out] pResult:		返回错误信息,参数pResult->code(错误码)如果为 0 表示成功,否则表示错误号;
*
* 返回值:返回卡密到期时间,失败返回NULL,错误信息请查看参数 pResult->message
*
*/
char* WINAPI apiSNGetKeyExpiresTime(HANDLE handle, SN_STATU* pResult);/*获取OCR文字识别结果(以json字符串形式返回)
*
* 参数:
*	[in]  handle:			句柄(通过调用apiSNCreateOCRHandle得到)
*  	[in]  szImageFilePath:	图片路径
* 	[out] pResult:			返回错误信息,参数pResult->code(错误码)如果为 0 表示成功,否则表示错误号;
*
* 返回值:返回OCR文字识别结果(以json字符串形式返回),失败返回NULL,错误信息请查看参数 pResult->message
*
*/
char* WINAPI apiSNGetOCRFromImage(HANDLE handle, char* szImageFilePath, SN_STATU* pStatu);/*释放OCR文字识别句柄(释放内存)
*
* 参数:
*	[in] handle:		句柄(通过调用apiSNCreateOCRHandle得到)
*
* 返回值:返回 0 表示成功,其他值表示错误号;
*
*/
int WINAPI apiSNDestroyOCRHandle(HANDLE handle);#endif

2.C++调用dll接口


#include <iostream>
#include "SNOCR.h"int main()
{struct SN_STATU statu = { 0 };char szExeFullPath[4096] = { 0 };char szImagePath[4096] = { 0 };//卡密char szKey[4096] = "SNKJe9xffLhdFY7r3TcffXq44ThDVcE3BQFQFfVA9VG4";//onnx模型路径char szOnnxFullPath[4096] = { 0 };GetModuleFileName(NULL, szExeFullPath, 4096);*strrchr(szExeFullPath, '\\') = 0;sprintf(szOnnxFullPath, "%s\\SNOCR.onnx", szExeFullPath);// 注意路径不要带有中文sprintf(szImagePath, "%s\\7.jpg", szExeFullPath);//1.启动OCR服务int ret = apiSNInitOCRServer(szOnnxFullPath, &statu);if (ret < 0){printf("Error:%s \n", statu.message);return 0;}//2.创建OCR句柄HANDLE handle = apiSNCreateOCRHandle(szKey, szOnnxFullPath, &statu);if (!handle){printf("Error:%s \n", statu.message);return 0;}//3.获取卡密到期时间char* szTime = apiSNGetKeyExpiresTime(handle, &statu);if (!szTime){printf("Error:%s \n", statu.message);return 0;}//4.识别OCR,返回Json字符串char* szJson = apiSNGetOCRFromImage(handle, szImagePath, &statu);if (!szJson){printf("Error:%s \n", statu.message);return 0;}printf("%s \n", szJson);//5.释放内存apiSNDestroyOCRHandle(handle);getchar();
}

三.效果演示

1.图片1

识别效果:

{"type":	0,"task_id":	1,"err_code":	0,"ocr_result":	{"single_result":	[{"left":	80.136589,"top":	56.710590,"right":	413.614105,"bottom":	89.287964,"str_utf8":	"包头市特种设备追溯平台","rate":	"0.981197"}, {"left":	171.293091,"top":	99.701866,"right":	329.740753,"bottom":	120.792061,"str_utf8":	"设备编码: 000001)","rate":	"0.970116"}, {"left":	81.693756,"top":	274.142029,"right":	229.766312,"bottom":	295.966248,"str_utf8":	"RFID 扫描区域","rate":	"0.992770"}, {"left":	50,"top":	318.229156,"right":	181.250000,"bottom":	339.062500,"str_utf8":	"投诉电话: 12365","rate":	"0.984698"}, {"left":	259.311310,"top":	352.951111,"right":	466.734924,"bottom":	371.130615,"str_utf8":	"包头市质量技术监督局制","rate":	"0.961233"}],"width":	"500","height":	"384"}
}

2.图片2

识别效果:

{"type":	0,"task_id":	1,"err_code":	0,"ocr_result":	{"single_result":	[{"left":	451.128448,"top":	110.489426,"right":	1138.148070,"bottom":	199.850967,"str_utf8":	"中华人民共和国","rate":	"0.998395"}, {"left":	398.003052,"top":	250.290588,"right":	1189.906010,"bottom":	370.648926,"str_utf8":	"居民身份证","rate":	"0.999714"}, {"left":	333.586945,"top":	605.802917,"right":	1028.648680,"bottom":	654.308594,"str_utf8":	"签发机关上海市公安局徐汇分局","rate":	"0.998378"}, {"left":	334.754303,"top":	712.041199,"right":	539.191406,"bottom":	752.816345,"str_utf8":	"有效期限","rate":	"0.999937"}, {"left":	551.186523,"top":	713.943665,"right":	1061.341670,"bottom":	754.974915,"str_utf8":	"2005.10.08-202510.08","rate":	"0.985583"}],"width":	"1313","height":	"858"}
}

四.常见问题

1.是否支持多线程

支持

五.更新日志

  • 2024.12.15 OCR 文字识别支持C++/Python/易语言

六.云盘源码下载

  • 百度云盘
  • 夸克云盘
  • 123云盘

http://www.ppmy.cn/news/1556476.html

相关文章

SQLMAP

Taeget 实践内容&#xff1a;练习使用 SQLMap 进行自动化 SQL 注入。 涉及知识点&#xff1a;理解 SQL 注入、SQLMap 工具使用、自动化攻击、Web 应用安全。 Trial 说明&#xff1a;Sqlmap是一个开源的渗透测试工具&#xff0c;可以自动检测和利用SQL注入漏洞&#xff0c;并…

【算法】图论中DFS和BFS模板讲解

图论的解题模板和二叉树基本一致&#xff0c;都是在DFS和BFS基础上进行求解。 二叉树的DFS和BFS模板如下所示&#xff1a; public void DFSTree(TreeNode root){if(rootnull)return null;DFSTree(root.left);DFSTree(root.right); } public void BFSTree(TreeNode ro…

免费开源了一个图床工具 github-spring-boot-starter

文章目录 第一步&#xff0c;新建一个SpringBoot项目第二步&#xff0c;在pom文件里面引入jar包第三步&#xff0c;配置你的github信息github.authorization1、进入github官网&#xff0c;登录账号&#xff0c;点击头像&#xff0c;选择setting2、选择[Developer Settings](htt…

[Unity Shader] 【游戏开发】Unity Shader的结构2-深入理解 SubShader 的结构与应用

在 Unity 中,Shader 是图形渲染管线中的核心组件,而 SubShader 是 Shader 结构中不可或缺的部分。每个 Unity Shader 文件可以包含多个 SubShader,它们根据不同的显卡和硬件条件提供不同的渲染实现。本文将详细介绍 SubShader 的结构、标签(Tags)、渲染设置(RenderSetup)…

Android14 AOSP支持短按关机

修改frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java diff --git a/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/base/services/core/java/com/android/server/policy/PhoneWindowManager.java in…

电脑文档损坏:原因剖析和修复方法

在使用电脑的过程中&#xff0c;许多用户可能会遇到文档突然提示损坏、无法打开的情况。这种情况的发生往往让人感到困惑&#xff0c;特别是当并未进行任何明显错误操作时。以下是一些常见的原因以及应对方法。 一、文档损坏的常见原因 1、非人为的异常操作&#xff1a; 在编…

碰一碰发视频 + 智能文案生成全解析,支持OEM

一、引言 在数字化营销的汹涌浪潮中&#xff0c;新颖且高效的推广策略不断迭代涌现。“碰一碰发视频” 结合 “点评打卡、种草文案一键生成” 的创新模式&#xff0c;宛如一颗璀璨的营销新星&#xff0c;正以燎原之势重塑商家与消费者的互动生态&#xff0c;为品牌传播及用户引…

低延迟!实时处理!中软高科AI边缘服务器,解决边缘计算多样化需求!

根据相关统计&#xff0c;随着物联网的发展和5G技术的普及&#xff0c;到2025年&#xff0c;全球物联网设备连接数将达到1000亿&#xff0c;海量的计算数据使得传输到云端再处理的云计算方式显得更捉襟见肘。拥有低延迟、实时处理、可扩展性和更高安全性的边缘计算应运而生&…