慕雪素颜 發表於 2026-2-23 22:53:00

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

<p>随着AI技术的发展,图像识别技术应用越来越广泛,OCR(Optical Character Recognition,光学字符识别)技术做为图像识别技术的应用场景之一,广泛的应用于零售,政务,工业,金融等领域,如车牌号识别,身份证识别等。今天以一个简单的小例子,简述在.NET开发中,如何利用第三方OCR组件库进行图像文字识别,仅供学习分享使用,如有不足之处,还请指正。</p>
<p>&nbsp;</p>
<h1>什么是OCR</h1>
<p>&nbsp;</p>
<p>OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;通俗一点将,OCR技术就是识别图像上的文本字符内容,进而用于分析或其他用途。</p>
<p>&nbsp;</p>
<h1>PaddleOCRSharp简介</h1>
<p>&nbsp;</p>
<p>PaddleOCR是百度开源的OCR工具库,基于PaddlePaddle深度学习框架构建,集成了文本检测、方向分类和文字识别三大核心模块。其技术架构采用CRNN(卷积循环神经网络)与DB(Differentiable Binarization)算法的组合,在保持高精度的同时实现高效推理。PaddleOCRSharp是一款C#版的基于百度飞桨OCR进行封装的文字识别组件,它简化了PaddleOCR的相关调用,并可以不依赖网络进行离线识别,并且识别效率和准确率也相当高。</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202601/1068941-20260119215210901-553761055.png"></p>
<p>&nbsp;</p>
<h1>应用实例</h1>
<p>&nbsp;</p>
<p>首先创建一个WinForm程序,并通过Nuget包管理器安装PaddleOCRSharp组件,如下所示:</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202601/1068941-20260119211209202-1352482589.png"></p>
<p>说明:PaddleOCRSharp组件运行时,依赖Paddle.Runtime.win_x64组件,否则无法运行,安装成功后编译程序,在输出目录下可以看到PaddleOCRSharp引用库,以及模型文件,主要包含以下三种:</p>
<ol>
<li>inference目录为离线模型文件夹,存放OCR文字识别所需的模型文件。</li>
<li>Paddle开头的为OCR识别的依赖库</li>
<li>飞桨OCR技术是基于C++开发的,所以需要C++运行环境。</li>
</ol>
<p>具体如下所示:</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202601/1068941-20260119212001294-2055819453.png"></p>
<p>&nbsp;</p>
<h1>核心代码</h1>
<p>&nbsp;</p>
<p>PaddleOCRSharp应用非常简单,只需要几行代码即可实现文字识别,主要包含如下内容:</p>
<ol>
<li>初始化PaddleOCREngine引擎实例对象,此对象可不必每次识别都初始化,可定义为全局变量,只在软件启动时进行初始化,频繁的初始化可能会导致失败或其他问题。</li>
<li>调用实例的DetectText方法即可,此方法接收一个Bitmap类型的图像实例,并返回一个OCRResult结果。</li>
<li>遍历OCRResult的的TextBlocks属性,即可获取所有识别的文本。</li>
</ol>
<p>具体如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>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(() =&gt;
                        {
                                this.txtInfo.AppendText(block.Text + Environment.NewLine);
                        });
      }
    }
}</code></pre>
<p>&nbsp;</p>
<h1>辅助代码</h1>
<p>&nbsp;</p>
<p>本实例首先读取用户选择的图片,并显示到页面上,代码如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>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;
    }
}</code></pre>
<p>图像识别,调用上述封装好的PaddleOcr方法,由于PaddleOCR识别时间比较长,避免造成页面卡顿,采用后台线程处理,并通过IProgress接口更新识别状态,如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>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(() =&gt;
        {
                this.progress.Report(true);
                PaddleOcr();
                this.progress.Report(false);
        });
}</code></pre>
<p>&nbsp;IProgress接口用于更新UI上识别进度,如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>private IProgress&lt;bool&gt; progress;

private void FrmMain_Load(object sender, EventArgs e)
{
        this.progress = new Progress&lt;bool&gt;(UpdteProgressStatus);
}

private void UpdteProgressStatus(bool running)
{
        this.Invoke(() =&gt;
        {
                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;
                }
        });
}</code></pre>
<p>&nbsp;</p>
<h1>OCR识别效果</h1>
<p>&nbsp;</p>
<p>上述代码运行后实例,网上找了一张身份证示例图片,识别结果如下:</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202601/1068941-20260119214905046-105570183.gif"></p>
<p>&nbsp;</p>
<h1>进一步思考</h1>
<p>&nbsp;</p>
<p>在实际应用中,受限于图像的清晰度,颜色,大小或其他干扰因素,只靠OCR识别并一定能准确完整的识别出其中的文本,此时可能需要结合其他的计算机视觉开发技术,如灰度,二值化等去噪技术进行预处理,才能提升识别的精确度。</p>
<p>以上就是《推荐一款基于.NET和百度飞桨的OCR识别组件》的全部内容,旨在抛砖引玉,一起学习,共同进步。</p>

</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">

    <p style="border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 30px; font-family: 微软雅黑; font-size: 12px" id="PSignature">
<br>

   <img alt="" src="https://images.cnblogs.com/cnblogs_com/hsiang/1154298/o_115f1cd8.jpg" width="80px" height="80px">
   
    作者:老码识途
    <br>
    出处:http://www.cnblogs.com/hsiang/
    <br>
    本文版权归作者和博客园共有,写文不易,支持原创,欢迎转载【点赞】,转载请保留此段声明,且在文章页面明显位置给出原文连接,谢谢。
    <br>关注个人公众号,定时同步更新技术及职场文章
<br><br>
   </p>
</div><br><br>
来源:https://www.cnblogs.com/hsiang/p/19503840
頁: [1]
查看完整版本: 推荐一款基于.NET和百度飞桨的OCR识别组件