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

推荐订阅源

T
Troy Hunt's Blog
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
B
Blog RSS Feed
S
Securelist
H
Help Net Security
Security Archives - TechRepublic
Security Archives - TechRepublic
S
Secure Thoughts
Spread Privacy
Spread Privacy
C
Check Point Blog
WordPress大学
WordPress大学
AWS News Blog
AWS News Blog
L
Lohrmann on Cybersecurity
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
Blog — PlanetScale
Blog — PlanetScale
PCI Perspectives
PCI Perspectives
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Cyber Attacks, Cyber Crime and Cyber Security
Google Online Security Blog
Google Online Security Blog
The Hacker News
The Hacker News
宝玉的分享
宝玉的分享
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cisco Blogs
Last Week in AI
Last Week in AI
Webroot Blog
Webroot Blog
GbyAI
GbyAI
I
InfoQ
罗磊的独立博客
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
Latest news
Latest news
P
Palo Alto Networks Blog
博客园 - Franky
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security Affairs
H
Hacker News: Front Page
P
Privacy & Cybersecurity Law Blog
小众软件
小众软件
The Register - Security
The Register - Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
V
Vulnerabilities – Threatpost
人人都是产品经理
人人都是产品经理
博客园_首页
aimingoo的专栏
aimingoo的专栏

博客园 - 老码识途呀

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