C++ 文字识别OCR

news2025/1/13 7:07:42

        一.引言

文字识别,也称为光学字符识别(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":	[{
				"single_rate":	0.939104,
				"left":	102.208336,
				"top":	41.812500,
				"right":	329.854156,
				"bottom":	67.829170,
				"single_str_utf8":	"中国建设银行"
			}, {
				"single_rate":	0.966887,
				"left":	104.431534,
				"top":	68.423492,
				"right":	309.992828,
				"bottom":	84.602386,
				"single_str_utf8":	"China Construction Bank"
			}, {
				"single_rate":	0.968900,
				"left":	102.672920,
				"top":	96.168755,
				"right":	403.258331,
				"bottom":	111.964584,
				"single_str_utf8":	"龙卡通(储蓄卡)LONG CARD(DEBIT CARD)"
			}, {
				"single_rate":	0.975151,
				"left":	41.781921,
				"top":	137.955643,
				"right":	410.251556,
				"bottom":	164.107880,
				"single_str_utf8":	"6227 0033 2069 0222 205"
			}, {
				"single_rate":	0.935433,
				"left":	20.770407,
				"top":	210.668716,
				"right":	77.230583,
				"bottom":	230.122101,
				"single_str_utf8":	"ATM"
			}, {
				"single_rate":	0.960131,
				"left":	103.137505,
				"top":	185.368759,
				"right":	192.337509,
				"bottom":	207.204163,
				"single_str_utf8":	"CCB GZ"
			}, {
				"single_rate":	0.929293,
				"left":	338.376495,
				"top":	201.118103,
				"right":	417.111450,
				"bottom":	224.273529,
				"single_str_utf8":	"UnionPa"
			}, {
				"single_rate":	0.917808,
				"left":	367.485413,
				"top":	220.677078,
				"right":	413.479156,
				"bottom":	239.260422,
				"single_str_utf8":	"银联"
			}],
		"unknown_1":	446,
		"unknown_2":	280
	}
}

2.图片2

识别效果:

{
	"type":	0,
	"task_id":	1,
	"err_code":	0,
	"ocr_result":	{
		"single_result":	[{
				"single_rate":	0.919637,
				"left":	622.061157,
				"top":	123.251556,
				"right":	1046.638920,
				"bottom":	190.015121,
				"single_str_utf8":	"马托13610000670"
			}, {
				"single_rate":	0.996936,
				"left":	40.618664,
				"top":	324.310150,
				"right":	541.513184,
				"bottom":	371.843231,
				"single_str_utf8":	"广州利驰服装有限公司"
			}, {
				"single_rate":	0.997014,
				"left":	624.066650,
				"top":	218.300000,
				"right":	1040.933350,
				"bottom":	242.966675,
				"single_str_utf8":	"地址:广州市海珠区赤岗路173号"
			}, {
				"single_rate":	0.964238,
				"left":	624.066650,
				"top":	251.600000,
				"right":	844.833374,
				"bottom":	276.266663,
				"single_str_utf8":	"金丰大厦503室"
			}, {
				"single_rate":	0.979285,
				"left":	625.300000,
				"top":	286.133331,
				"right":	1044.633300,
				"bottom":	309.566681,
				"single_str_utf8":	"厂址:广州市海珠区赤岗西路232"
			}, {
				"single_rate":	0.996300,
				"left":	624.066650,
				"top":	318.200000,
				"right":	759.733337,
				"bottom":	341.633331,
				"single_str_utf8":	"号-234号"
			}, {
				"single_rate":	0.991057,
				"left":	624.066650,
				"top":	351.500000,
				"right":	925,
				"bottom":	374.933350,
				"single_str_utf8":	"热线:400-688-7260"
			}, {
				"single_rate":	0.964125,
				"left":	625.239319,
				"top":	381.016510,
				"right":	922.600220,
				"bottom":	404.499695,
				"single_str_utf8":	"电话:020-84022958"
			}, {
				"single_rate":	0.993601,
				"left":	624.066650,
				"top":	408.233337,
				"right":	923.766663,
				"bottom":	432.900000,
				"single_str_utf8":	"传真:020-84022572"
			}, {
				"single_rate":	0.950434,
				"left":	625.203430,
				"top":	438.767609,
				"right":	1107.616580,
				"bottom":	464.666626,
				"single_str_utf8":	"邮箱:kunhemwl@yahoo.com.cn"
			}, {
				"single_rate":	0.962023,
				"left":	624.066650,
				"top":	471.133331,
				"right":	1001.466670,
				"bottom":	494.566681,
				"single_str_utf8":	"网址:www.hxkunhe.com"
			}],
		"unknown_1":	1184,
		"unknown_2":	614
	}
}

四.常见问题

1.是否支持多线程

支持

五.更新日志

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

六.云盘源码下载

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

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

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

相关文章

SpringBoot:SaToken的options预检请求鉴权失败

问题描述 使用如下sa-token配置&#xff0c;前端通过IP端口号的方式访问后端服务&#xff0c;会存在options预检请求鉴权失败的问题。 问题分析 http-options请求 HTTP OPTIONS 方法请求给定的 URL 或服务器的允许通信选项。客户端可以用这个方法指定一个 URL&#xff0c;或者…

UE材质函数

材质函数是可在不同材质中重复使用的材质表达式的一个集合 相当于把常用的功能封装到一个集合里&#xff0c;需要用到的时候调用 输入input可以添加输入节点 如果勾上公开到库&#xff0c;就可以在材质面板直接搜索到材质函数 材质函数可以直接做成一个输出

51c~Pytorch~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/13059544 一、PyTorch DDP 正在郁闷呢 jetson nx 的torchvision安装~~ 自带就剩5g 想弄到ssd 项目中的 venv中又 cuda.h没有... 明明已经装好什么都对 算了说今天主题 啊对 还是搬运啊 学习之工具人而已 勿怪 Distrib…

用vscode写latex-1

一般大伙使用 LaTeX 大体有两种方案&#xff0c; 一种是在本地配置环境或使用本地的软件&#xff0c;如 vscode LaTeX&#xff0c;texlive&#xff0c;lyx 等等&#xff1b; 另一种是线上 LaTeX 平台&#xff0c;其中用的最多的是 Overleaf&#xff0c;还有一部分高校也有自…

用户界面软件05

已知应用 几乎所有的流行的用户界面架构都使用这种模式。我在这里举三个例子&#xff1a; 1. Seeheim 用户界面架构的特点是有一个应用核心的领域层和一个用户界面层。后者 被分为两层&#xff0c;叫做表示层和对话控制层。因为这个架构和面向事务系统有渊源&#xff0c;没有…

虚拟文件系统 VFS

目录 虚拟文件系统 VFS 文件系统挂载过程 虚拟文件系统 VFS 统一标准的系统调用接口&#xff1a; VFS定义了一组标准的文件操作API&#xff0c;如open(), read(), write(), close()等&#xff0c;使得用户空间的应用程序无需关心底层文件系统的具体类型。 下层文件系统必须实现…

conda 批量安装requirements.txt文件

通常可以用下面conda命令安装requirements.txt文件 conda install --yes --file requirements.txt 但是&#xff0c;一旦遇到某个包安装失败&#xff0c;就会停止安装后续的包。 下面这条命令能解决上面出现的不执行后续包的问题&#xff0c;需要在CMD窗口执行&#xff1a; 点…

Auto-CoT:自动构建大模型的思维链提示

今天分享的是由上海交通大学发表的一篇文章&#xff1a;Auto-COT 论文题目&#xff1a;AUTOMATIC CHAIN OF THOUGHT PROMPTING IN LARGE LANGUAGE MODELS 论文链接&#xff1a;https://arxiv.org/pdf/2210.03493 代码地址&#xff1a;https://github.com/amazon-science/aut…

算法练习7——拦截导弹的系统数量求解

题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 假设某天雷达捕捉到敌国的导弹来袭。由于该系统还在试用…

命令行中打印二维码

前公司中登录设备时&#xff0c;需要下发密钥&#xff0c;密钥是通过扫描终端中的二维码获得的&#xff0c;终端中的二维码类似这样&#xff1a; 当时没理解原理&#xff0c;现在研究了下如何在命令行中打印二维码。主要介绍其中一些开源工具&#xff1a; 1. qrencode 简介 …

Android车机DIY开发之软件篇(八)单独编译

Android车机DIY开发之软件篇(八)单独编译 1.CarLauncher单独编译 CarLauncher源码位于 packages/apps/Car/Launcher 用Eclipse ADT 谷歌定制版编译而成&#xff0c;.mk .bp编译 Android13目录如下: alientekalientek:~/packages/apps/Car$ ls Calendar …

3 前端: Web开发相关概念 、HTML语法、CSS语法

文章目录 前言:导学1 Web开发相关概念2 Web标准(网页标准)3 软件架构(CS/BS)(1)C/S: Client/Server 客户端 / 服务器端(2)B/S: Browser/Server 浏览器 / 服务器端VSCode配置前段开发环境一、HTML概念1 概念2 HTML快速入门(1)语法快速入门(2)VSCode一个 !(快捷键…

Redis:内存管理

1. 最大内存限制 (maxmemory) 简介 概念:maxmemory 参数用于设置 Redis 实例允许使用的最大内存量。作用:当 Redis 使用的内存达到这个限制时,它会根据配置的淘汰策略来决定如何处理新的写入请求或移除现有数据。示例 # 设置最大内存为2GB maxmemory 2gb注意事项 合理规划…

C语言进阶——1数据的存储

目录 1. 数据类型介绍1.1 类型的基本归类&#xff1a;1.1.1 整形家族1.1.2 浮点型家族1.1.3 构造类型&#xff1a;1.1.4.指针类型1.1.5 void 表示空类型&#xff08;无类型&#xff09; 2. 整形在内存中的存储2.1 原码、反码、补码2.1.1 示例 20在计算机中的存储 2.2 大小端2.2…

OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性

本文作者&#xff1a; 容器服务团队&#xff1a;刘佳旭、冯诗淳 可观测团队&#xff1a;竺夏栋、麻嘉豪、隋吉智 一、前言 Kubernetes(K8s)架构已经是当今 IT 架构的主流与事实标准&#xff08;CNCF Survey[1]&#xff09;。随着承接的业务规模越来越大&#xff0c;用户也在使…

【微服务】面试 1、概述和服务发现

微服务面试题 课程内容架构 Spring Cloud 部分 服务注册&#xff1a;重点讲解&#xff08;Nacos&#xff09;和&#xff08;Eureka&#xff09;&#xff0c;这是微服务架构中实现服务发现与注册的关键组件&#xff0c;确保服务间能够相互定位与通信。负载均衡&#xff1a;涵盖…

Mybatis冲冲冲00(含如何配置模版文件)

官方网站:mybatis – MyBatis 3 | 入门 mybatis安装方式1.下jar包(网址在上),2.Maven(代码也由上可找) 两个核心配置文件 1.核心主配置文件:configuration.xml(文件名自定义),通常设置为mybatis-config.xml 2.SQL映射文件:mapper.xml(文件名自定义),通常设置为:实体类名.xml…

【Rust】引用与借用

目录 思维导图 1. 引用与借用的基本概念 1.1. 引用示例 2. 借用的规则 2.1. 可变借用示例 2.2. 借用的限制 3. 引用的生命周期 思维导图 1. 引用与借用的基本概念 引用的定义&#xff1a;引用是一种指向数据的指针&#xff0c;但与裸指针不同&#xff0c;Rust的引用在编…

django网上商城系统

Django网上商城系统是一种基于Django框架构建的电子商务解决方案&#xff0c;它充分利用了Django框架的强大功能&#xff0c;为开发者提供了一个快速构建在线商店的平台。 一、系统架构与技术栈 Django网上商城系统采用MVC&#xff08;模型-视图-控制器&#xff09;架构&…

Node.js - 模块化与包管理工具

1. 前言 模块化是代码组织的方式&#xff0c;而包管理工具是管理模块的工具。在现代项目开发中&#xff0c;模块化和包管理工具几乎是不可分割的一部分&#xff0c;它们一起构成了高效的开发工作流。 包代表了一组特定功能的源码集合&#xff0c;包管理工具可以对包进行下载安…