惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
T
Threat Research - Cisco Blogs
量子位
Last Week in AI
Last Week in AI
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
F
Fortinet All Blogs
爱范儿
爱范儿
D
Docker
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
A
About on SuperTechFans
P
Proofpoint News Feed
博客园 - 司徒正美
Recent Announcements
Recent Announcements
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
Webroot Blog
Webroot Blog
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
SecWiki News
SecWiki News
Attack and Defense Labs
Attack and Defense Labs
Hacker News: Ask HN
Hacker News: Ask HN
AI
AI
博客园_首页
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Recorded Future
Recorded Future
T
Tailwind CSS Blog
MyScale Blog
MyScale Blog
T
Tenable Blog
宝玉的分享
宝玉的分享
Google Online Security Blog
Google Online Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
S
Secure Thoughts
C
Check Point Blog
S
Security Affairs
L
LINUX DO - 最新话题
大猫的无限游戏
大猫的无限游戏
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
月光博客
月光博客
Y
Y Combinator Blog

博客园 - 老码识途呀

基于.NET的Windows窗体编程之WinForms图像控件 基于.NET的Windows窗体编程之WinForms提示控件 基于.NET的Windows窗体编程之WinForms时间控件 基于.NET的Windows窗体编程之WinForms图表控件 基于.NET的Windows窗体编程之WinForms输入与显示 基于.NET的Windows窗体编程之WinForms菜单工具栏 基于.NET的Windows窗体编程之WinForms打印 基于.NET的Windows窗体编程之WinForms对话框 基于.NET的Windows窗体编程之WinForms列表控件 基于.NET的Windows窗体编程之WinForms数据表格 基于.NET的Windows窗体编程之WinForms事件简介 基于.NET的Windows窗体编程之WinForms布局简介 基于.NET的Windows窗体编程之WinForms控件简介 基于.NET的Windows窗体编程之WinForms入门简介 新书速递,手把手教你WPF入门与开发 推荐一种并发线程中资源同步常用方法 推荐一种手动设置异步线程等待机制的解决方案 推荐一种异步线程执行过程中更新进度的方法 推荐一款基于.NET的进程间数据交互经典解决方案 推荐一款线程or进程间数据同步解决方案 推荐一款代码规范检查(CodeReview)神器 推荐一款高性能状态机管理解决方案 推荐一款进程间高速交换数据的解决方案 推荐一款基于.NET的进程间通信框架 推荐一款基于EF-Core的分库分表利器 推荐一种程序崩溃闪退或卡死的分析方法 推荐一款Excel读写神器之MiniExcel入门详解 推荐一款Ioc容器之Ninject入门详解 ASP.NET Core WebApi+React UI开发入门详解
推荐一款基于.NET和百度飞桨的OCR识别组件
老码识途呀 · 2026-02-23 · via 博客园 - 老码识途呀

随着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识别组件》的全部内容,旨在抛砖引玉,一起学习,共同进步。