当前位置: 首页 > news >正文

推荐一款基于.NET和百度飞桨的OCR识别组件

随着AI技术的发展,图像识别技术应用越来越广泛,OCR(Optical Character Recognition,光学字符识别)技术做为图像识别技术的应用场景之一,广泛的应用于零售,政务,工业,金融等领域,如车牌号识别,身份证识别等。今天以一个简单的小例子,简述在.NET开发中,如何利用第三方OCR组件库进行图像文字识别,仅供学习分享使用,如有不足之处,还请指正。

 

什么是OCR

 

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;通俗一点将,OCR技术就是识别图像上的文本字符内容,进而用于分析或其他用途。

 

PaddleOCRSharp简介

 

PaddleOCR是百度开源的OCR工具库,基于PaddlePaddle深度学习框架构建,集成了文本检测、方向分类和文字识别三大核心模块。其技术架构采用CRNN(卷积循环神经网络)与DB(Differentiable Binarization)算法的组合,在保持高精度的同时实现高效推理。PaddleOCRSharp是一款C#版的基于百度飞桨OCR进行封装的文字识别组件,它简化了PaddleOCR的相关调用,并可以不依赖网络进行离线识别,并且识别效率和准确率也相当高。

image

 

应用实例

 

首先创建一个WinForm程序,并通过Nuget包管理器安装PaddleOCRSharp组件,如下所示:

image

说明:PaddleOCRSharp组件运行时,依赖Paddle.Runtime.win_x64组件,否则无法运行,安装成功后编译程序,在输出目录下可以看到PaddleOCRSharp引用库,以及模型文件,主要包含以下三种:

  1. inference目录为离线模型文件夹,存放OCR文字识别所需的模型文件。
  2. Paddle开头的为OCR识别的依赖库
  3. 飞桨OCR技术是基于C++开发的,所以需要C++运行环境。

具体如下所示:

image

 

核心代码

 

PaddleOCRSharp应用非常简单,只需要几行代码即可实现文字识别,主要包含如下内容:

  1. 初始化PaddleOCREngine引擎实例对象,此对象可不必每次识别都初始化,可定义为全局变量,只在软件启动时进行初始化,频繁的初始化可能会导致失败或其他问题。
  2. 调用实例的DetectText方法即可,此方法接收一个Bitmap类型的图像实例,并返回一个OCRResult结果。
  3. 遍历OCRResult的的TextBlocks属性,即可获取所有识别的文本。

具体如下所示:

private void PaddleOcr()
{OCRModelConfig config = null;OCRParameter ocrParameter = new OCRParameter();// 初始化引擎PaddleOCREngine engine = new PaddleOCREngine(config, ocrParameter);Bitmap bmp = new Bitmap(this.txtImageFile.Text);// 调用OCR引擎进行识别OCRResult ocrResult = engine.DetectText(bmp);if (ocrResult != null){foreach (var block in ocrResult.TextBlocks){//Console.WriteLine($"文字: {block.Text}");//Console.WriteLine($"方向: {block.Direction}"); // 输出文字方向信息if (string.IsNullOrEmpty(block.Text)){continue;}this.Invoke(() =>{this.txtInfo.AppendText(block.Text + Environment.NewLine);});}}
}

 

辅助代码

 

本实例首先读取用户选择的图片,并显示到页面上,代码如下所示:

private void btnOpen_Click(object sender, EventArgs e)
{this.txtImageFile.Text = "";OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "图片PNG|*.png|图片JPG|*.jpg|图片JPEG|*.jpeg";openFileDialog.Multiselect = false;if (openFileDialog.ShowDialog() == DialogResult.OK){string imageFile = openFileDialog.FileName;using (Stream fs = new FileStream(imageFile, FileMode.Open)){Image image = Image.FromStream(fs);this.pbImg.Image = image;}this.txtImageFile.Text = imageFile;}
}

图像识别,调用上述封装好的PaddleOcr方法,由于PaddleOCR识别时间比较长,避免造成页面卡顿,采用后台线程处理,并通过IProgress接口更新识别状态,如下所示:

private void btnRecognize_Click(object sender, EventArgs e)
{if (string.IsNullOrEmpty(txtImageFile.Text) || !File.Exists(txtImageFile.Text)){MessageBox.Show("请选择需要识别的图片");return;} this.txtInfo.Clear();Task task = Task.Run(() =>{this.progress.Report(true);PaddleOcr();this.progress.Report(false);});
}

 IProgress接口用于更新UI上识别进度,如下所示:

private IProgress<bool> progress;private void FrmMain_Load(object sender, EventArgs e)
{this.progress = new Progress<bool>(UpdteProgressStatus);
}private void UpdteProgressStatus(bool running)
{this.Invoke(() =>{if (running){this.lblStatus.Text = "进行中";this.pbRecognizeStatus.Visible = true;this.lblStatus.ForeColor = Color.Red;}else{this.lblStatus.Text = "完成";this.pbRecognizeStatus.Visible = false;this.lblStatus.ForeColor = Color.Green;}});
}

 

OCR识别效果

 

上述代码运行后实例,网上找了一张身份证示例图片,识别结果如下:

image

 

进一步思考

 

在实际应用中,受限于图像的清晰度,颜色,大小或其他干扰因素,只靠OCR识别并一定能准确完整的识别出其中的文本,此时可能需要结合其他的计算机视觉开发技术,如灰度,二值化等去噪技术进行预处理,才能提升识别的精确度。

以上就是《推荐一款基于.NET和百度飞桨的OCR识别组件》的全部内容,旨在抛砖引玉,一起学习,共同进步。

http://www.jsqmd.com/news/406145/

相关文章:

  • 揭秘大数据领域数据预处理的隐藏优势
  • 超标电动自行车现象与治理:一场关乎3.8亿辆两轮出行的安全革命
  • 深度学习篇---Transformer解码器
  • 禁止Windows系统自动更新的方法,关闭win11更新的工具软件
  • vue3基于python的鲜花预订商城销售管理系统(编号:5770421)
  • 题解:P4723 【模板】常系数齐次线性递推
  • Doris数据分片策略详解:提升大数据查询效率的关键
  • P2757 [国家集训队] 等差子序列
  • 深度解析GPT在AI原生应用领域的应用场景
  • AI写专著不再愁!专业工具详细解读,助你高效完成学术使命
  • 借助AI专著撰写神器!高效完成专著,节省大量时间精力
  • 格雷厄姆特价股票策略在高科技行业的应用挑战
  • 从技术到管理:AI应用架构师转型项目管理的方法论与心路历程
  • 全球股市估值与可再生能源并网技术的关系
  • 【电池】基于PMP算法的插电式混合动力车 能量优化控制策略附Matlab代码
  • 微博评论采集
  • 【电力系统】风力涡轮机控制的 velvet 半有理多项式 MPC算法附matlab代码
  • JavaScript 类型转换
  • 【电池】基于LPV模型预测控制方法和耦合电热模型的电池状态估计附matlab代码
  • Python 量化:技术、应用与未来趋势
  • FastAPI的Alembic踩坑记录:缺失历史迁移脚本如何保留数据重建版本控制
  • Bumble Android HFP漏洞利用PoC:智能设备蓝牙协议安全分析
  • 计算机毕业设计springboot学员课外任务自主分配管理系统 基于SpringBoot的高校学生课外实践任务智能调度平台 SpringBoot框架下学员第二课堂任务协同分配与追踪系统
  • 【控制】工业过程的容错线性参数 varying模型预测控制方案附matlab代码
  • 【车辆控制】基于考虑天气条件和路面坡度的电动汽车基于电压的制动控制附Matlab代码
  • 【优化调度】电动车协调与非协调充放电的比较分析附Matlab代码
  • Linux运维实战:巧用mv命令管理多版本Go环境,避免采坑
  • Context Engineering 3.0:企业级上下文工程,非常详细收藏我这一篇就够了
  • 《Foundation 开关》
  • XQuery 函数