找回密码
 立即注册
首页 业界区 安全 推荐一款基于.NET和百度飞桨的OCR识别组件 ...

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

损注 3 天前
随着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的相关调用,并可以不依赖网络进行离线识别,并且识别效率和准确率也相当高。
1.png

 
应用实例

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

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

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

 
核心代码

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

  • 初始化PaddleOCREngine引擎实例对象,此对象可不必每次识别都初始化,可定义为全局变量,只在软件启动时进行初始化,频繁的初始化可能会导致失败或其他问题。
  • 调用实例的DetectText方法即可,此方法接收一个Bitmap类型的图像实例,并返回一个OCRResult结果。
  • 遍历OCRResult的的TextBlocks属性,即可获取所有识别的文本。
具体如下所示:
  1. private void PaddleOcr()
  2. {
  3.     OCRModelConfig config = null;
  4.     OCRParameter ocrParameter = new OCRParameter();
  5.     // 初始化引擎
  6.     PaddleOCREngine engine = new PaddleOCREngine(config, ocrParameter);
  7.     Bitmap bmp = new Bitmap(this.txtImageFile.Text);
  8.     // 调用OCR引擎进行识别
  9.     OCRResult ocrResult = engine.DetectText(bmp);
  10.     if (ocrResult != null)
  11.     {
  12.         foreach (var block in ocrResult.TextBlocks)
  13.         {
  14.             //Console.WriteLine($"文字: {block.Text}");
  15.             //Console.WriteLine($"方向: {block.Direction}"); // 输出文字方向信息
  16.             if (string.IsNullOrEmpty(block.Text))
  17.             {
  18.                 continue;
  19.             }
  20.             this.Invoke(() =>
  21.                         {
  22.                                 this.txtInfo.AppendText(block.Text + Environment.NewLine);
  23.                         });
  24.         }
  25.     }
  26. }
复制代码
 
辅助代码

 
本实例首先读取用户选择的图片,并显示到页面上,代码如下所示:
  1. private void btnOpen_Click(object sender, EventArgs e)
  2. {
  3.     this.txtImageFile.Text = "";
  4.     OpenFileDialog openFileDialog = new OpenFileDialog();
  5.     openFileDialog.Filter = "图片PNG|*.png|图片JPG|*.jpg|图片JPEG|*.jpeg";
  6.     openFileDialog.Multiselect = false;
  7.     if (openFileDialog.ShowDialog() == DialogResult.OK)
  8.     {
  9.         string imageFile = openFileDialog.FileName;
  10.         using (Stream fs = new FileStream(imageFile, FileMode.Open))
  11.         {
  12.             Image image = Image.FromStream(fs);
  13.             this.pbImg.Image = image;
  14.         }
  15.         this.txtImageFile.Text = imageFile;
  16.     }
  17. }
复制代码
图像识别,调用上述封装好的PaddleOcr方法,由于PaddleOCR识别时间比较长,避免造成页面卡顿,采用后台线程处理,并通过IProgress接口更新识别状态,如下所示:
  1. private void btnRecognize_Click(object sender, EventArgs e)
  2. {
  3.         if (string.IsNullOrEmpty(txtImageFile.Text) || !File.Exists(txtImageFile.Text))
  4.         {
  5.                 MessageBox.Show("请选择需要识别的图片");
  6.                 return;
  7.         }
  8.         this.txtInfo.Clear();
  9.         Task task = Task.Run(() =>
  10.         {
  11.                 this.progress.Report(true);
  12.                 PaddleOcr();
  13.                 this.progress.Report(false);
  14.         });
  15. }
复制代码
 IProgress接口用于更新UI上识别进度,如下所示:
  1. private IProgress<bool> progress;
  2. private void FrmMain_Load(object sender, EventArgs e)
  3. {
  4.         this.progress = new Progress<bool>(UpdteProgressStatus);
  5. }
  6. private void UpdteProgressStatus(bool running)
  7. {
  8.         this.Invoke(() =>
  9.         {
  10.                 if (running)
  11.                 {
  12.                         this.lblStatus.Text = "进行中";
  13.                         this.pbRecognizeStatus.Visible = true;
  14.                         this.lblStatus.ForeColor = Color.Red;
  15.                 }
  16.                 else
  17.                 {
  18.                         this.lblStatus.Text = "完成";
  19.                         this.pbRecognizeStatus.Visible = false;
  20.                         this.lblStatus.ForeColor = Color.Green;
  21.                 }
  22.         });
  23. }
复制代码
 
OCR识别效果

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

 
进一步思考

 
在实际应用中,受限于图像的清晰度,颜色,大小或其他干扰因素,只靠OCR识别并一定能准确完整的识别出其中的文本,此时可能需要结合其他的计算机视觉开发技术,如灰度,二值化等去噪技术进行预处理,才能提升识别的精确度。
以上就是《推荐一款基于.NET和百度飞桨的OCR识别组件》的全部内容,旨在抛砖引玉,一起学习,共同进步。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册