PaddleOCRSharp,2022年,你来的晚了些,一款.NET离线使用的高精度OCR
一款免费且离线的.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的更多相关文章
- 全景VR视频外包公司:长年承接VR全景视频外包(技术分享YouTube的360全景视频)
虽然比预期来得晚了些,但YouTube终于支持360度全景视频了,这应该会吸引不少VR(虚拟现实)爱好者.今年1月,Google就表示这一功能将在“接下来”的几周出现.现在YouTube上已经有了一些 ...
- 我所理解的 惠普云 (HP Cloud)
HP (惠普)于2014年5月27日宣布了它的新的云产品线 HP Helion,并宣布在接下来的两年时间内向该产品线投资10亿美金.应该说这是一笔很大的投入,充分显示了HP 在云这个领域的决心.本文试 ...
- 【转】iOS 9自带苹果式省电模式 依然软硬兼施
非本人总结,转自:http://news.91.com/apple/1506/21837672.html 说好的改善和优化,iOS 9真的带来了.且不说那些经过改善的功能,iOS 9 推出的低功耗模式 ...
- JMS开源比较
Java开源JMS消息中间件 mom4j mom4j是一个完全实现JMS1.1规范的消息中间件并且向下兼容JMS1.0与1.02.它提供了自己的消息处理存储使它独立于关系数据与语言,所以它的客户端可以 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性+watch
回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...
- delphi 各版本的特性
delphi 各新版本特性收集 Delphi XE6新增了一些特性并增强了原有的功能,主要有以下几个方面: IDE(整合开发环境) Internet XML(扩展标记语言) Compiler( ...
- 为什么需要提前撰写Spec文档
Joel on Software(中文名叫<Joel软件随想录>)算得上是一本旧书了,但里面的建议和讨论,真的是历久弥新.特别是,Joel是个有趣.牛逼的家伙:前微软Excel的职员.St ...
- it's over | 2019 CSP-S 第二轮认证(超长预警)
也许应该从Day -1(2019年11月14日周四)开始说起? 卑微的我们在学长的怂恿下终于...停课了(哇我们太菜了,只停一天半的课有个卵用 早读后我带头去办公室请假,飞哥很大方地答应了,同时免了我 ...
- anchor_based-anchor_free object detectors
同步到知乎anchor_based-anchor_free object detectors 前言:最近关注了大量目标检测的论文,比较火的就是anchor based和anchor free两类问题: ...
随机推荐
- Excel字符串函数公式大全
一.Excel字符串的操作 1.1.Excel根据字节截取对应字符串(注:一个中文汉字对应两个字节) =LEFTB(A3,7) 从左边开始截取7个字节 =RIGHTB(A10,10) 从右边开始截取 ...
- Android系统编程入门系列之硬件交互——多媒体展示
前两篇文章通过麦克风硬件和摄像头硬件分别采集音频和视频的多媒体数据,在得到的多媒体数据通常是以编码文件的格式存储,在用户需要展示时,可通过设备的内置扩音器或蓝牙耳机等硬件播放音频,通过设备的显示屏或外 ...
- BUU PWN hitcontraining_bamboobox
本来想学习house of force,结果没用就直接做出来了...我用了三种方法来做这道题. 1.fastbins attack 2.unlink 3.house of force 可以改写got表 ...
- 添加备注信息(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 就在任务信息的[高级]选项卡隔壁,还有一个[备注]选项卡,可别拿备注不当回事,因为任务名称的字数不能太多. 好吧,张同学也 ...
- java 常用类库:格式化NumberFormat;SimpleDataFormat类(转换Data()对象);DateTimeFormatter 转换LocalDateTime时间对象
NumberFormat类 该类是一个做数字格式化的类,它是一个抽象类,无法实例化.它提供了parse()和format()方法,其中format用于将数值,格式转化成字符串,parse()用于把字符 ...
- Tornado WEB服务器框架 Epoll-- 【模板】
4.2 使用模板 1. 路径与渲染 使用模板,需要仿照静态文件路径设置一样,向web.Application类的构造函数传递一个名为template_path的参数来告诉Tornado从文件系统的一个 ...
- Boost Asio要点概述(一)
[注]本文不是boost asio的完整应用讲述,而是仅对其中要点的讲解,主要参考了Boost Asio 1.68的官方文档(https://www.boost.org/doc/libs/1_68_0 ...
- netty系列之:小白福利!手把手教你做一个简单的代理服务器
目录 简介 代理和反向代理 netty实现代理的原理 实战 总结 简介 爱因斯坦说过:所有的伟大,都产生于简单的细节中.netty为我们提供了如此强大的eventloop.channel通过对这些简单 ...
- RuoYi项目整合Mybatis-Plus 框架
RuoYi框架默认使用的是Mybatis框架 但是有的习惯使用MP框架,这就很不方便, 不过可以简单进行整合 引入依赖 <dependency> <groupId>com.ba ...
- 【LeetCode】279. Perfect Squares 解题报告(C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 四平方和定理 动态规划 日期 题目地址:https: ...