一款免费且离线的.NET使用的OCR,爱你又恨你!恨你来的太晚了。

PaddleOCRSharp

本项目是一个基于百度飞桨的PaddleOCR的C++代码修改并封装的.NET的类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能,同时针对小图识别不准的情况下,做了优化,提高识别准确率。项目封装极其简化,实际调用仅一行代码,极大的方便了中下游开发者的使用和降低了PaddleOCR的使用入门级别,同时提供不同的.NET框架使用,方便各个行业应用开发与部署。

其中PaddleOCR.dll文件是基于开源项目PaddleOCR的C++代码修改而成的C++动态库,基于opencv的x64编译而成的。

模型库支持轻量版(本项目)、服务器版模型库(更准确),可以自行更改模型库适用实际需求。

关于源码编译,建议采用vs2019及以上版本编译,如果遇到无法编译,请切换成release后再切换回debug即可。

本项目包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能,同时针对小图识别不准的情况下,做了优化,提高识别准确率。项目封装极其简化,实际调用仅几行代码,极大的方便了中下游开发者的使用和降低了PaddleOCR的使用入门级别,同时提供不同的.NET框架使用,支持框架如下:

net40;net461;netstandard2.0;netcoreapp3.1;net5.0;

方便各个行业应用开发与部署。

C++示例代码

#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include "string"
#include <include/Parameter.h>
#include <string.h>
using namespace std;
#pragma comment (lib,"PaddleOCR.lib")
extern "C" {
/// <summary>
/// PaddleOCREngine引擎初始化
/// </summary>
/// <param name="det_infer"></param>
/// <param name="cls_infer"></param>
/// <param name="rec_infer"></param>
/// <param name="keys"></param>
/// <param name="parameter"></param>
/// <returns></returns>
__declspec(dllimport) int* Initialize(char* det_infer, char* cls_infer, char* rec_infer, char* keys, OCRParameter parameter);
/// <summary>
/// 文本检测
/// </summary>
/// <param name="engine"></param>
/// <param name="imagefile"></param>
/// <param name="pOCRResult">返回结果</param>
/// <returns></returns>
__declspec(dllimport) int Detect(int* engine, char* imagefile, LpOCRResult* pOCRResult);
/// <summary>
/// 释放引擎对象
/// </summary>
/// <param name="engine"></param>
__declspec(dllimport) void FreeEngine(int* engine);
/// <summary>
/// 释放文本识别结果对象
/// </summary>
/// <param name="pOCRResult"></param>
__declspec(dllimport) void FreeDetectResult(LpOCRResult pOCRResult);
}; std::wstring string2wstring(const std::string& s)
{
int len;
int slength = (int)s.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
std::wstring r(buf);
delete[] buf;
return r;
} int main()
{
LpOCRResult lpocrreult;
OCRParameter parameter;
/*parameter.enable_mkldnn = false;*/
char path[MAX_PATH]; GetCurrentDirectoryA(MAX_PATH, path); string cls_infer(path);
cls_infer += "\\inference\\ch_ppocr_mobile_v2.0_cls_infer";
string rec_infer(path);
rec_infer += "\\inference\\ch_PP-OCRv2_rec_infer";
string det_infer(path);
det_infer += "\\inference\\ch_PP-OCRv2_det_infer";
string ocrkeys(path);
ocrkeys += "\\inference\\ppocr_keys.txt";
string imagefile(path);
imagefile += "\\test.jpg"; int* pEngine = Initialize(const_cast<char*>(det_infer.c_str()),
const_cast<char*>(cls_infer.c_str()),
const_cast<char*>(rec_infer.c_str()),
const_cast<char*>(ocrkeys.c_str()),
parameter); int cout = Detect(pEngine, const_cast<char*>(imagefile.c_str()), &lpocrreult);
std::wcout.imbue(std::locale("chs"));
for (size_t i = 0; i < cout; i++)
{
wstring ss = (WCHAR*)(lpocrreult->pOCRText[i].ptext);
std::wcout << ss;
}
FreeDetectResult(lpocrreult);
FreeEngine(pEngine);
std::cin.get();
}

.NET示例代码

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
if (ofd.ShowDialog() != DialogResult.OK) return;
var imagebyte = File.ReadAllBytes(ofd.FileName);
Bitmap bitmap = new Bitmap(new MemoryStream(imagebyte)); OCRModelConfig config = null;
OCRParameter oCRParameter = null;
OCRResult ocrResult = new OCRResult();
using (PaddleOCREngine engine = new PaddleOCREngine(config, oCRParameter))
{
ocrResult = engine.DetectText(bmp);
}
if (ocrResult != null)
{
MessageBox.Show(ocrResult.Text,"识别结果");
}

微信公众号

PaddleOCRSharp项目地址: 
码云:https://gitee.com/raoyutian/paddle-ocrsharp
github:https://github.com/raoyutian/PaddleOCRSharp

QQ群:318860399

PaddleOCRSharp,2022年,你来的晚了些,一款.NET离线使用的高精度OCR的更多相关文章

  1. 全景VR视频外包公司:长年承接VR全景视频外包(技术分享YouTube的360全景视频)

    虽然比预期来得晚了些,但YouTube终于支持360度全景视频了,这应该会吸引不少VR(虚拟现实)爱好者.今年1月,Google就表示这一功能将在“接下来”的几周出现.现在YouTube上已经有了一些 ...

  2. 我所理解的 惠普云 (HP Cloud)

    HP (惠普)于2014年5月27日宣布了它的新的云产品线 HP Helion,并宣布在接下来的两年时间内向该产品线投资10亿美金.应该说这是一笔很大的投入,充分显示了HP 在云这个领域的决心.本文试 ...

  3. 【转】iOS 9自带苹果式省电模式 依然软硬兼施

    非本人总结,转自:http://news.91.com/apple/1506/21837672.html 说好的改善和优化,iOS 9真的带来了.且不说那些经过改善的功能,iOS 9 推出的低功耗模式 ...

  4. JMS开源比较

    Java开源JMS消息中间件 mom4j mom4j是一个完全实现JMS1.1规范的消息中间件并且向下兼容JMS1.0与1.02.它提供了自己的消息处理存储使它独立于关系数据与语言,所以它的客户端可以 ...

  5. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性+watch

    回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...

  6. delphi 各版本的特性

    delphi 各新版本特性收集 Delphi XE6新增了一些特性并增强了原有的功能,主要有以下几个方面:   IDE(整合开发环境)   Internet XML(扩展标记语言) Compiler( ...

  7. 为什么需要提前撰写Spec文档

    Joel on Software(中文名叫<Joel软件随想录>)算得上是一本旧书了,但里面的建议和讨论,真的是历久弥新.特别是,Joel是个有趣.牛逼的家伙:前微软Excel的职员.St ...

  8. it's over | 2019 CSP-S 第二轮认证(超长预警)

    也许应该从Day -1(2019年11月14日周四)开始说起? 卑微的我们在学长的怂恿下终于...停课了(哇我们太菜了,只停一天半的课有个卵用 早读后我带头去办公室请假,飞哥很大方地答应了,同时免了我 ...

  9. anchor_based-anchor_free object detectors

    同步到知乎anchor_based-anchor_free object detectors 前言:最近关注了大量目标检测的论文,比较火的就是anchor based和anchor free两类问题: ...

随机推荐

  1. ciscn_2019_ne_5

    首先checksec和查看多少位的程序 可以看到是32位的程序,放入ida中 进入getflag 可以看到strcpy存在栈溢出,所以大体思路就是输入密码进入选择1造成溢出然后进入选择4获取shell ...

  2. [BUUCTF]PWN——bjdctf_2020_babyrop2

    bjdctf_2020_babyrop2 附件 步骤: 例行检查,64位程序,开启了NX和canary保护 2. 试运行一下程序,看看大概的情况 提示我们去泄露libc 3. 64位ida载入,从ma ...

  3. Table.ReplaceValue替换…Replace…(Power Query 之 M 语言)

    数据源: 任意数据源,包括文本和非文本两列 目标: 对数据进行替换操作 操作过程: [主页](或[转换])>[替换值] M公式: = Table.ReplaceValue( 表, 查找值, 替换 ...

  4. 端云协同,打造更易用的AI计算平台

    内容来源:华为开发者大会2021 HMS Core 6 AI技术论坛,主题演讲<端云协同,HUAWEI HiAI Foundation打造更易用的AI计算平台>. 演讲嘉宾:华为海思AI技 ...

  5. SpringCloud (一) Eureka

    Eureka Eureka 是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心. Eureka 是一个基于 REST 的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移 ...

  6. java 输入输出IO 转换流-字符编码

    编码和其产生的问题: 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果. 按照某种规则,将字符存储到计算机中,称为编码 .反之,将存 ...

  7. 宕机导致分区丢失恢复方案testdisk

    一.执行此预案的动机 云主机数据盘分区丢失 二.执行此预案的条件 1.确定用户在报障时间点之前有过数据盘分区存在,而在报障时间点该分区消失 2.在执行我们的恢复操作之前,确保将分区所在数据盘进行备份 ...

  8. Json解析案例-teachers数据集

    背景: 通过平台执行接口时,接口往往返回的JSON串,所以平台要能提供方便快捷的JSON解析函数. 一.Json字符串: 1 { 2 "lemon": { 3 "teac ...

  9. 基于 SoC 的卷积神经网络车牌识别系统设计(1)概述

    NOTES: 这是第三届全国大学生集成电路创新创业大赛 - Arm 杯 - 片上系统设计挑战赛(本人指导的一个比赛).主要划分为以下的 Top5 重点.难点.亮点.热点以及创新点:1.通过 Arm C ...

  10. UDP&串口调试助手用法(5)

    note 提供安装包 基于win10开发 已通过win10测试,windows其他平台,没有测试 日志 2021-09-18 1.修复计算校验和错误的现象 2.屏蔽不计算校验和位置的REG验证(后期更 ...