在 C# 中快速配置 OCR 以获得最佳性能

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronOCR 的快速配置可通过使用 EnglishFast 语言模式和禁用条形码读取等不必要的功能,将 OCR 处理速度提高 17%,且不会造成准确性损失。 这种优化非常适合时间紧迫的大批量处理。

IronOCR 开箱即可有效运行。 当速度优先于绝对准确性时,IronOCR 可提供快速配置。 此设置可大幅提高扫描性能,而对准确性的影响却很小,因此比标准的 OCR 配置要快得多。

本文演示了如何设置快速配置,并比较了快速配置和标准 IronOCR 配置的基准结果。 无论您是在处理 扫描文档PDF,还是在处理 图像,这些优化都能显著提高应用程序的性能。


as-heading:2(快速入门:在 C# 中配置快速 OCR)

快速配置的主要组件是 Language 属性。 将Language属性设置为OcrLanguage.EnglishFast会优先考虑速度,而不会在准确性方面付出较小的潜在代价。 这使得 IronOCR 的批量阅读速度大大加快,这在时间至关重要的任务关键型应用中尤其有用。

除了设置快速语言外,您还可以通过禁用不必要的配置(如 ReadBarCodes )来进一步提高速度。 让 IronOCR 自动检测页面分割,以保持设置简单。 有关更多高级配置选项,请参阅我们的 Tesseract 详细配置指南

下面的代码示例处理了以下输入图像:

我应该使用什么输入格式?

《白鲸记》开篇文本在深色背景上以白色显示,显示出以实玛利的介绍

快速配置需要哪些代码?

Nuget Icon立即开始使用 NuGet 创建 PDF 文件:

  1. 使用 NuGet 包管理器安装 IronOCR

    PM > Install-Package IronOcr

  2. 复制并运行这段代码。

    /* :path=/static-assets/ocr/content-code-examples/how-to/ocr-fast-configuration.cs */
    using IronOcr;
    using System;
    
    var ocrTesseract = new IronTesseract();
    
    // Fast Dictionary
    ocrTesseract.Language = OcrLanguage.EnglishFast;
    
    // Turn off unneeded options
    ocrTesseract.Configuration.ReadBarCodes = false;
    
    // Assume text is laid out neatly in an orthogonal document
    ocrTesseract.Configuration.PageSegmentation模式 = TesseractPageSegmentation模式.Auto;
    
    using var ocrInput = new OcrInput();
    ocrInput.LoadImage("image.png");
    
    var ocrResult = ocrTesseract.Read(ocrInput);
    Console.WriteLine(ocrResult.Text);
  3. 部署到您的生产环境中进行测试

    立即开始在您的项目中使用 IronOCR,免费试用!
    arrow pointer

我可以期待什么结果?

Visual Studio 编辑器显示《白鲸》小说的开头段落

这是从上方提取的文本输出。 OCR 引擎可以准确捕捉文学文本,同时保持原始格式和结构。 快速配置为像本例这样清晰、高对比度的文本提供了出色的效果。


快速配置与标准配置相比有何优势?

<! -- 待办事项:在此处添加图片 --> <! --! ocr 快速配置基准实施示意图 --> <!--说明:说明代码概念的图表或截图 -->

为了展示真实世界的影响,我们对标准配置和快速配置的性能进行了基准测试。 我们使用一组 10 个样本图片(每个图片包含几个段落)来比较使用快速配置的性能和可视化权衡。

对于标准配置,我们使用默认设置初始化 IronTesseract ,不应用任何速度导向属性。 这种基准方法类似于我们的性能跟踪指南,它展示了如何实时监控 OCR 操作。

以下是我们用于运行测试的输入示例。这些图像代表了您在处理 多页文档或批处理操作时可能遇到的典型文档场景。

如何运行基准测试?

:path=/static-assets/ocr/content-code-examples/how-to/ocr-fast-configuration-benchmark.cs
using IronOcr;
using System;
using System.Diagnostics;
using System.IO;

// --- Tesseract Engine Setup ---
var ocrTesseract = new IronTesseract();
ocrTesseract.Language = OcrLanguage.EnglishFast;
ocrTesseract.Configuration.ReadBarCodes = false;
ocrTesseract.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;

// --- 1. Define folder and get files ---
string folderPath = @"images"; // IMPORTANT: Set this to your image directory
string filePattern = "*.png";    // Change to "*.jpg", "*.bmp", etc. as needed
string outputFilePath = "ocr_results.txt"; // The new results file

// Get all image files in the directory
var imageFiles = Directory.GetFiles(folderPath, filePattern);

Console.WriteLine($"Found {imageFiles.Length} total images to process...");
Console.WriteLine($"Results will be written to: {outputFilePath}");

// --- 2. Start timer and process images, writing to file ---
// Open the output file *before* the loop for efficiency
using (StreamWriter writer = new StreamWriter(outputFilePath))
{
    var stopwatch = Stopwatch.StartNew();

    foreach (var file in imageFiles)
    {
        string fileName = Path.GetFileName(file);

        using var ocrInput = new OcrInput();
        ocrInput.LoadImage(file);

        var ocrResult = ocrTesseract.Read(ocrInput);

        // Check if any text was actually found
        if (!string.IsNullOrEmpty(ocrResult.Text))
        {
            // Write to Console
            Console.WriteLine($"--- Text found in: {fileName} ---");
            Console.WriteLine(ocrResult.Text.Trim());
            Console.WriteLine("------------------------------------------");

            // Write to File
            writer.WriteLine($"--- Text found in: {fileName} ---");
            writer.WriteLine(ocrResult.Text.Trim());
            writer.WriteLine("------------------------------------------");
            writer.WriteLine(); // Add a blank line for readability
        }
        else
        {
            // Write to Console
            Console.WriteLine($"No text found in: {fileName}");

            // Write to File
            writer.WriteLine($"No text found in: {fileName}");
            writer.WriteLine();
        }
    }

    stopwatch.Stop();

    // --- 3. Print and write final benchmark summary ---
    string lineSeparator = "\n========================================";
    string title = "Batch OCR Processing Complete";
    string summary = $"Fast configuration took {stopwatch.Elapsed.TotalSeconds:F2} seconds";

    // Write summary to Console
    Console.WriteLine(lineSeparator);
    Console.WriteLine(title);
    Console.WriteLine("========================================");
    Console.WriteLine(summary);

    // Write summary to File
    writer.WriteLine(lineSeparator);
    writer.WriteLine(title);
    writer.WriteLine("========================================");
    writer.WriteLine(summary);

    if (imageFiles.Length > 0)
    {
        string avgTime = $"Average time per image: {(stopwatch.Elapsed.TotalSeconds / (double)imageFiles.Length):F3} seconds";
        Console.WriteLine(avgTime);
        writer.WriteLine(avgTime);
    }
}

Console.WriteLine($"\nSuccessfully saved results to {outputFilePath}");
Imports IronOcr
Imports System
Imports System.Diagnostics
Imports System.IO

' --- Tesseract Engine Setup ---
Dim ocrTesseract As New IronTesseract()
ocrTesseract.Language = OcrLanguage.EnglishFast
ocrTesseract.Configuration.ReadBarCodes = False
ocrTesseract.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto

' --- 1. Define folder and get files ---
Dim folderPath As String = "images" ' IMPORTANT: Set this to your image directory
Dim filePattern As String = "*.png" ' Change to "*.jpg", "*.bmp", etc. as needed
Dim outputFilePath As String = "ocr_results.txt" ' The new results file

' Get all image files in the directory
Dim imageFiles = Directory.GetFiles(folderPath, filePattern)

Console.WriteLine($"Found {imageFiles.Length} total images to process...")
Console.WriteLine($"Results will be written to: {outputFilePath}")

' --- 2. Start timer and process images, writing to file ---
' Open the output file *before* the loop for efficiency
Using writer As New StreamWriter(outputFilePath)
    Dim stopwatch = Stopwatch.StartNew()

    For Each file In imageFiles
        Dim fileName As String = Path.GetFileName(file)

        Using ocrInput As New OcrInput()
            ocrInput.LoadImage(file)

            Dim ocrResult = ocrTesseract.Read(ocrInput)

            ' Check if any text was actually found
            If Not String.IsNullOrEmpty(ocrResult.Text) Then
                ' Write to Console
                Console.WriteLine($"--- Text found in: {fileName} ---")
                Console.WriteLine(ocrResult.Text.Trim())
                Console.WriteLine("------------------------------------------")

                ' Write to File
                writer.WriteLine($"--- Text found in: {fileName} ---")
                writer.WriteLine(ocrResult.Text.Trim())
                writer.WriteLine("------------------------------------------")
                writer.WriteLine() ' Add a blank line for readability
            Else
                ' Write to Console
                Console.WriteLine($"No text found in: {fileName}")

                ' Write to File
                writer.WriteLine($"No text found in: {fileName}")
                writer.WriteLine()
            End If
        End Using
    Next

    stopwatch.Stop()

    ' --- 3. Print and write final benchmark summary ---
    Dim lineSeparator As String = vbLf & "========================================"
    Dim title As String = "Batch OCR Processing Complete"
    Dim summary As String = $"Fast configuration took {stopwatch.Elapsed.TotalSeconds:F2} seconds"

    ' Write summary to Console
    Console.WriteLine(lineSeparator)
    Console.WriteLine(title)
    Console.WriteLine("========================================")
    Console.WriteLine(summary)

    ' Write summary to File
    writer.WriteLine(lineSeparator)
    writer.WriteLine(title)
    writer.WriteLine("========================================")
    writer.WriteLine(summary)

    If imageFiles.Length > 0 Then
        Dim avgTime As String = $"Average time per image: {(stopwatch.Elapsed.TotalSeconds / CDbl(imageFiles.Length)):F3} seconds"
        Console.WriteLine(avgTime)
        writer.WriteLine(avgTime)
    End If
End Using

Console.WriteLine(vbLf & $"Successfully saved results to {outputFilePath}")
$vbLabelText   $csharpLabel

该基准代码演示了几个重要概念:

1.批量处理:代码在单个操作中处理多个图像,类似于我们的多线程 OCR 示例,该示例展示了如何利用并行处理来提高速度。

2.性能测量:使用 Stopwatch 类可提供精确到毫秒的定时测量,这对于比较不同的配置至关重要。

3.结果记录:控制台和文件输出可确保您稍后分析结果并验证不同配置之间的准确性差异。

我可以期待哪些性能提升?

模式 总时间 平均耗时/图像 与标准相比,时间增益 与标准相比,精度提升
标准 10.40秒 1.040秒 基线 基线
快速 8.60秒 0.860秒 +17.31%(速度更快) +0%(相同)

标准配置和快速配置之间的基准比较显示,快速配置具有显著的性能优势。 通过将标准模式作为基准(总耗时 10.40 秒),快速配置仅用 8.60 秒就完成了同一批 10 张图片的翻译。 这意味着时间上节省了17.31%。 最重要的是,速度的提高并没有影响质量; 两种模式的准确性完全相同,两种配置产生的文本输出也相同。

要验证结果,您可以下载快速文本输出标准文本输出

何时应该使用快速配置?

快速配置对以下方面尤其有益

  • 大量文档处理,数千页文档需要快速处理
  • 实时应用程序,响应时间至关重要
  • 需要保持响应式用户体验的 Web 应用程序
  • 批量处理系统,运行时间紧迫

对于涉及多种语言低质量扫描牌照护照等专业文档类型的更复杂的情况,您可能需要使用标准配置来确保最大的准确性。

IronOCR 使配置之间的切换变得简单--只需更改几个属性,您的应用程序就能适应不同的性能要求,而无需对代码进行重大修改。

常见问题解答

快速 OCR 配置比标准设置快多少?

与标准 OCR 设置相比,IronOCR 的快速配置可使处理速度提高 17%,而对准确性的影响却微乎其微。这种性能提升是通过 EnglishFast 语言模式和禁用不必要的功能实现的。

实现快速 OCR 处理的主要设置是什么?

在 IronOCR 中实现快速配置的主要组件是将语言属性设置为 OcrLanguage.EnglishFast。这将速度放在首位,而不是在准确性方面付出较小的潜在代价,因此非常适合批量处理和时间紧迫的应用程序。

除了使用 EnglishFast 模式外,如何进一步优化 OCR 速度?

您可以通过禁用 IronOCR 中不必要的功能来提高速度,例如,如果不需要条形码检测,可将 ReadBarCodes 设置为 false。此外,还可以使用 TesseractPageSegmentationMode.Auto 让 IronOCR 自动检测页面分割。

何时应使用快速 OCR 配置而不是标准设置?

IronOCR 中的快速 OCR 配置非常适合大批量处理场景,在这些场景中,时间至关重要,而在准确性方面稍作权衡是可以接受的。对于需要快速处理扫描文档、PDF 或图像的关键任务应用程序来说,它尤其有用。

快速配置是否适用于所有文档类型?

是的,IronOCR 的快速配置可有效处理各种文档类型,包括扫描文档、PDF 和图像。无论您处理的是哪种输入格式,都能获得优化优势。

使用快速 OCR 模式是否会降低准确性?

IronOCR 的快速配置可显著提高扫描性能,而对准确性的影响却微乎其微。虽然在使用 EnglishFast 模式时可能会在准确性方面付出一些潜在的代价,但对于优先考虑速度的应用程序来说,这种权衡往往是值得的。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 5,384,824 | 版本: 2026.2 刚刚发布