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

推荐订阅源

Google DeepMind News
Google DeepMind News
S
Secure Thoughts
Application and Cybersecurity Blog
Application and Cybersecurity Blog
AWS News Blog
AWS News Blog
GbyAI
GbyAI
腾讯CDC
WordPress大学
WordPress大学
V
V2EX
小众软件
小众软件
C
CXSECURITY Database RSS Feed - CXSecurity.com
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
H
Hacker News: Front Page
Scott Helme
Scott Helme
The Hacker News
The Hacker News
Schneier on Security
Schneier on Security
K
Kaspersky official blog
S
Security @ Cisco Blogs
N
News | PayPal Newsroom
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Threatpost
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Martin Fowler
Martin Fowler
P
Privacy International News Feed
Blog — PlanetScale
Blog — PlanetScale
D
DataBreaches.Net
O
OpenAI News
P
Proofpoint News Feed
J
Java Code Geeks
B
Blog RSS Feed
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
阮一峰的网络日志
阮一峰的网络日志
P
Palo Alto Networks Blog
Engineering at Meta
Engineering at Meta
AI
AI
Google DeepMind News
Google DeepMind News
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
G
GRAHAM CLULEY
A
Arctic Wolf
N
Netflix TechBlog - Medium
L
LINUX DO - 最新话题
爱范儿
爱范儿
博客园 - 聂微东

博客园 - 老码识途呀

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