易语言OCR证件照文字识别

news2024/12/18 9:45:46

  一.引言

文字识别,也称为光学字符识别(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接口

.版本 2
.支持库 spec
 
.程序集 窗口程序集_启动窗口
 
.子程序 _启动子程序, 整数型
 
_临时子程序 ()
返回 (0)
 
 
.子程序 _临时子程序
.局部变量 handle, 整数型
.局部变量 pResult, SN_STATU, 静态, , 返回错误信息,参数pResult.code(错误码)如果为 0 表示成功,否则表示错误号;
.局部变量 szOCRJson, 文本型, , , OCR识别结果 (json字符串);
.局部变量 szTime, 文本型, , , 卡密结束时间;
 
' ---------------------------------------------------------------
' 1.启动 OCR 文字识别服务
' 其中卡密 SNKJe9xffLhdFY7r3TcffXq44ThDVcE3BQFQFfVA9VG4 仅用于测试,需要找开发人员重新购买,购买卡密连接:https://shop.4yuns.com/links/7C9F16B7
' ---------------------------------------------------------------
apiSNInitOCRServer (“SNOCR.onnx”, pResult)
调试输出 (pResult.code, 到文本 (pResult.message))
.如果真 (pResult.code < 0)
    调试输出 (“-----------程序结束-----------”)
    返回 ()
 
.如果真结束
' 2.创建 OCR 文字识别句柄
handle = apiSNCreateOCRHandle (“SNKJe9xffLhdFY7r3TcffXq44ThDVcE3BQFQFfVA9VG4”, “SNOCR.onnx”, pResult)
调试输出 (pResult.code, 到文本 (pResult.message))
调试输出 (“句柄”, handle)
.如果真 (pResult.code < 0)
    调试输出 (“-----------程序结束-----------”)
    返回 ()
.如果真结束
' 3.识别 OCR 文字识别,返回 json 字符串
szOCRJson = apiSNGetOCRFromImage (handle, “d:\\22.png”, pResult)
调试输出 (到文本 (szOCRJson))
 
' 4.识别 OCR 文字卡密到期时间
szTime = apiSNGetKeyExpiresTime (handle, pResult)
调试输出 (到文本 (szTime))
' 5.释放 OCR 文字识别内存
apiSNDestroyOCRHandle (handle)
调试输出 (“-----------程序结束-----------”)

三.效果演示

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.coloradmin.cn/o/2261518.html

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

相关文章

Haproxy 高可用代理原理配置(Haproxy High Availability Proxy Principle Configuration)

Haproxy 高可用代理原理 简介 Haproxy是一个开源的高可用性负载均衡解决方案,提供基于TCP和HTTP的应用代理服务。它支持高并发连接,能够处理大量的请求,特别适合高负载站点和需要会话保持的应用场景。 主要特点 ‌高可用性‌:…

企业微信可信域名个人配置方法,个人添加企业微信可信IP方法5.0版本,无论是否企业认证都通用。

自动22年11月份开始更新企业微信可信域名配置方法后,先后阿里(22年11月)1.0可信域名配置方法、腾讯(2022年12月14日)2.0版本可信域名配置方法、百度(2023年1月27日)、华为(2023年2月…

Endnote | 查看文献所在分组

软件版本:Endnote X8 第一种方式: 在文献上右键——记录摘要,即可在弹出页面上看到自定义和智能组的分组情况。 第二种方式: 在菜单栏点击文献——记录摘要,也可以查看分组情况。 注: 新版本的endnote软件…

力扣-图论-15【算法学习day.65】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…

练习题:一维数组

练习题 第一题 键盘录入一组数列&#xff0c;利用冒泡排序将数据由大到小排序 代码 #include <stdio.h>int arr_home01() {int arr[10];int i,j,temp;printf("请输入10个测试整数&#xff1a;\n");int len sizeof(arr) / sizeof(arr[0]);for(i 0;i < …

Kerberos身份验证

Kerberos是更现代化的身份验证协议&#xff0c;它比 NTLM 认证更安全&#xff0c;但域内某些服务仍支持 NTLM 认证。Kerberos 和 NTLM 认证一样&#xff0c;都是通过在 SSPI 接口实现的功能&#xff0c;这使得使用第三方协议&#xff08;如&#xff1a;HTTP、SMB、LDAP&#xf…

Kotlin复习

一、Kotlin类型 1.整数 2.浮点 显示转换&#xff1a; 所有数字类型都支持转换为其他类型&#xff0c;但是转换前会检测长度。 toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double 不同进制的数字表示方法&#xff08;为了提高…

12月17日作业

#include <myhead.h>int main(int argc, const char *argv[]) {int pipefd[2];char buff[1024] "hello world";char s[1024];if(pipe(pipefd)-1){perror("pipe");return -1;}//读端pipefd[0] 写端pipefd[1]pid_t pid fork();//创建子进程if(pid0){…

Shopee算法分析 - 算法分析二(与URL有关的Key)

http://blog.androidcrack.com/index.php/archives/39/ 在Unidbg文章中, 我们尝试过多次主动调用, 文中可以发现, 只有253b8c85 这个的key是不变的. Unidbg运行一遍,搜索运行下这个Key, 我们在下面的堆栈中, 可以看到memcpy的调用地址为0x0498ec Unidbg trace整个流程, 在010ed…

ChatGPT重大更新:新增实时搜索和高级语音

12月17日消息&#xff0c;据报道&#xff0c;OpenAI开启了第八天技术分享直播&#xff0c;对ChatGPT搜索功能进行了大量更新。 此次ChatGPT新增的功能亮点纷呈。其中&#xff0c;实时搜索功能尤为引人注目。OpenAI对搜索算法进行了深度优化&#xff0c;使得用户提出问题后&…

Day9 神经网络的偏导数基础

多变量函数与神经网络 在神经网络中&#xff0c;我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如&#xff0c;一个简单的神经元输出可以表示为&#xff1a; z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…

windows和LINUX下校验文件的哈希值(MD5、SHA256)

可以通过两个文件的哈希值来对比两个文件是不是一模一样&#xff0c;有没有缺失 1、windows CertUtil -hashfile 文件路径 MD5 CertUtil -hashfile 文件路径 SHA256 2、Liunx 校验当前目录下所有文件 sha256sum . 校验指定文件名 sha256sum 文件名

使用beego操作数据库的简单web项目

1、beego介绍 Beego 是一个开源的、高性能的Go语言框架&#xff0c;用于快速开发RESTful API、Web应用、后端服务等各种类型的软件。它由国人Asta Xie创建&#xff0c;并得到了广泛的社区支持。Beego的设计理念是让开发者能够以最少的时间和代码量来完成Web应用的开发。 以下是…

IS-IS协议

IS-IS协议介绍 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;协议是一种链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在同一个自治系统&#xff08;Autonomous System, AS&#xff09;内部的路由器之间交换路由信息。IS-I…

不良人系列-复兴数据结构(栈和队列)

个人主页&#xff1a;爱编程的小新☆ 不良人经典语录&#xff1a;“相呴相济 玉汝于成 勿念 心安” 目录 一. 栈(stack) 1. 栈的概念 2. 栈的常见方法 3.栈的模拟实现 ​编辑 二. 队列 1. 队列的概念 2. 队列的使用 2.1 队列的常见方法 2.2 队列的模拟实现 2.3 队列…

机器学习04-为什么Relu函数

机器学习0-为什么Relu函数 文章目录 机器学习0-为什么Relu函数 [toc]1-手搓神经网络步骤总结2-为什么要用Relu函数3-进行L1正则化修改后的代码解释 4-进行L2正则化解释注意事项 5-Relu激活函数多有夸张1-细数Relu函数的5宗罪2-Relu函数5宗罪详述 6-那为什么要用这个Relu函数7-文…

win服务器的架设、windows server 2012 R2 系统的下载与安装使用

文章目录 windows server 2012 R2 系统的下载与安装使用1 windows server 2012 的下载2 打开 VMware 虚拟机软件&#xff08;1&#xff09;新建虚拟机&#xff08;2&#xff09;设置虚拟机&#xff08;3&#xff09;打开虚拟机 windows server 2012&#xff08;4&#xff09;进…

241217-解决Ollama无法通过配置文件修改模型下载路径的方法

A. 常规修改下载模型路径的方法 Linux怎样设置ollama保存模型的路径&#xff1f; - 南门子的回答 - 知乎 B. 上述方法失效时的解决方案 Is there a way to change the download/run directory? Issue #680 ollama/ollama 具体来说也就是在ollama serve 启动之前&#xff…

戴森球计划新玩法!利用MOD和cpolar实现公网环境多人游戏

文章目录 前言1. 下载MOD2.配置cpolar内网穿透3. 主机开启联机3.1 玩家加入游戏 4. 配置固定的TCP端口5. 游玩体验 前言 《戴森球计划》不仅是一款融合了科幻冒险与经营管理元素的游戏&#xff0c;更是一个让玩家在浩瀚宇宙中尽情探索和创造的平台。在这个游戏中&#xff0c;你…

农田“智能管家”:道品科技农业移动式水肥一体机

一、农业移动式水肥一体机的兴起背景 &#xff08;一&#xff09;现代农业面临的挑战 在全球人口持续增长的大背景下&#xff0c;如今的粮食需求较以往有了大幅度增加。据相关统计数据显示&#xff0c;预计到 2030 年&#xff0c;全世界仍有近 6 亿人口长期食物不足。为了保障…