C#使用Tesseract进行中文识别的详细步骤

 更新时间:2026年03月05日 08:53:33   作者:小盆友你是否很有多问号  
文章介绍了如何在C#中使用Tesseract进行中文识别,包括环境准备、安装NuGet包、配置语言数据文件、基本使用代码、核心API详解、高级功能与优化等步骤,需要的朋友可以参考下

1. 环境准备与安装

1.1 安装 NuGet 包

在 Visual Studio 中,通过 NuGet 包管理器安装 Tesseract:

1.2 配置语言数据文件

Tesseract 需要语言训练数据文件(.traineddata)才能识别特定语言的文字。对于中文识别,我们需要下载简体中文语言包:

下载语言包:

访问 Tesseract OCR GitHub下载 chi_sim.traineddata(简体中文)
创建文件夹结构:
在项目根目录创建 tessdata文件夹,并将下载的语言文件放入其中。

设置文件属性:

右键点击 chi_sim.traineddata文件
生成操作:设置为"内容"
复制到输出目录:设置为"如果较新则复制" 或 “始终复制”
基本使用代码

using System;
using Tesseract;

class Program
{
    static void Main(string[] args)
    {
        // 图片路径
        string imagePath = @"D:\test.png";
        // tessdata 文件夹路径
        string tessDataPath = @".\tessdata";

        try
        {
            // 初始化Tesseract引擎,使用简体中文
            using (var engine = new TesseractEngine(tessDataPath, "chi_sim", EngineMode.Default))
            {
                // 加载图片
                using (var img = Pix.LoadFromFile(imagePath))
                {
                    // 进行OCR识别
                    using (var page = engine.Process(img))
                    {
                        // 获取识别结果
                        string text = page.GetText();
                        // 获取识别置信度
                        float confidence = page.GetMeanConfidence();
                        
                        Console.WriteLine("识别结果:");
                        Console.WriteLine("-----------------------------------");
                        Console.WriteLine(text);
                        Console.WriteLine("-----------------------------------");
                        Console.WriteLine($"识别置信度: {confidence:P}");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"识别出错: {ex.Message}");
        }
    }
}

2.核心API详解

2.1引擎模式对比表

page.GetMeanConfidence()- 置信度获取
GetMeanConfidence()方法返回OCR识别的置信度,数值范围在0.0到1.0之间,表示识别结果的可靠程度。

2.2引擎模式对比表

3. 高级功能与优化

public Pix PreprocessImage(string imagePath)
{
    // 加载原始图片
    using (var original = Pix.LoadFromFile(imagePath))
    {
        // 1. 转为灰度图
        using (var gray = original.ConvertRGBToGray())
        {
            // 2. 调整对比度
            using (var contrast = gray.AdjustContrast(1.5f))
            {
                // 3. 二值化(黑白化)
                using (var binary = contrast.BinarizeOtsuAdaptiveThreshold())
                {
                    // 4. 降噪
                    using (var denoised = binary.RemoveNoise())
                    {
                        // 5. 锐化
                        using (var sharpened = denoised.UnsharpMasking(1.5f, 0.7f))
                        {
                            return sharpened.Clone();
                        }
                    }
                }
            }
        }
    }
}

3.1页面分割模式(Page Segmentation Mode)

// 设置不同的页面分割模式
public void SetPageSegmentationModes(TesseractEngine engine)
{
    // 模式0: 方向检测和脚本检测
    engine.SetVariable("tessedit_pageseg_mode", "0");
    
    // 模式1: 自动页面分割,启用方向检测
    engine.SetVariable("tessedit_pageseg_mode", "1");
    
    // 模式2: 自动页面分割,不启用方向检测
    engine.SetVariable("tessedit_pageseg_mode", "2");
    
    // 模式3: 全自动页面分割(默认)
    engine.SetVariable("tessedit_pageseg_mode", "3");
    
    // 模式4: 假设单列可变大小的文本
    engine.SetVariable("tessedit_pageseg_mode", "4");
    
    // 模式5: 假设统一的垂直对齐文本块
    engine.SetVariable("tessedit_pageseg_mode", "5");
    
    // 模式6: 假设统一的文本块
    engine.SetVariable("tessedit_pageseg_mode", "6");
    
    // 模式7: 将图像视为单个文本行
    engine.SetVariable("tessedit_pageseg_mode", "7");
    
    // 模式8: 将图像视为单个单词
    engine.SetVariable("tessedit_pageseg_mode", "8");
    
    // 模式9: 将图像视为圆形中的单个单词
    engine.SetVariable("tessedit_pageseg_mode", "9");
    
    // 模式10: 将图像视为单个字符
    engine.SetVariable("tessedit_pageseg_mode", "10");
}

3.2识别特定区域(ROI)

public string RecognizeRegion(string imagePath, Rect region)
{
    using (var engine = new TesseractEngine(tessDataPath, "chi_sim", EngineMode.Default))
    {
        using (var img = Pix.LoadFromFile(imagePath))
        {
            // 设置识别区域
            using (var page = engine.Process(img, region))
            {
                return page.GetText();
            }
        }
    }
}

// 使用示例
Rect region = new Rect(100, 100, 300, 200); // x, y, width, height
string result = RecognizeRegion(@"D:\test.png", region);

4.智能OCR识别类

using System;
using System.Collections.Generic;
using System.IO;
using Tesseract;

namespace TesseractOCRHelper
{
    public class SmartOCR
    {
        private readonly string _tessDataPath;
        
        public SmartOCR(string tessDataPath = null)
        {
            _tessDataPath = tessDataPath ?? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata");
            
            if (!Directory.Exists(_tessDataPath))
            {
                throw new DirectoryNotFoundException($"tessdata目录不存在: {_tessDataPath}");
            }
        }
        
        /// <summary>
        /// 识别图片中的文字
        /// </summary>
        public OcrResult Recognize(string imagePath, string language = "chi_sim", 
                                   EngineMode? engineMode = null, Rect? region = null)
        {
            if (!File.Exists(imagePath))
            {
                return new OcrResult
                {
                    Success = false,
                    ErrorMessage = $"图片文件不存在: {imagePath}"
                };
            }
            
            try
            {
                var mode = engineMode ?? EngineMode.Default;
                
                using (var engine = new TesseractEngine(_tessDataPath, language, mode))
                {
                    // 优化识别参数
                    ConfigureEngine(engine);
                    
                    using (var img = Pix.LoadFromFile(imagePath))
                    {
                        Page page;
                        
                        if (region.HasValue)
                        {
                            page = engine.Process(img, region.Value);
                        }
                        else
                        {
                            page = engine.Process(img);
                        }
                        
                        using (page)
                        {
                            return new OcrResult
                            {
                                Success = true,
                                Text = page.GetText(),
                                Confidence = page.GetMeanConfidence(),
                                EngineMode = mode.ToString(),
                                Language = language
                            };
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                return new OcrResult
                {
                    Success = false,
                    ErrorMessage = $"OCR识别失败: {ex.Message}"
                };
            }
        }
        
        /// <summary>
        /// 智能识别:自动选择最佳引擎
        /// </summary>
        public OcrResult SmartRecognize(string imagePath, float confidenceThreshold = 0.7f)
        {
            // 先用默认模式
            var result = Recognize(imagePath, "chi_sim", EngineMode.Default);
            
            // 如果置信度低于阈值,尝试LSTM模式
            if (result.Success && result.Confidence < confidenceThreshold)
            {
                Console.WriteLine($"默认模式置信度较低({result.Confidence:P}),尝试LSTM模式...");
                
                var lstmResult = Recognize(imagePath, "chi_sim", EngineMode.LstmOnly);
                if (lstmResult.Success && lstmResult.Confidence > result.Confidence)
                {
                    lstmResult.Message = $"从默认模式切换到LSTM模式,置信度提升: {result.Confidence:P} -> {lstmResult.Confidence:P}";
                    return lstmResult;
                }
            }
            
            return result;
        }
        
        /// <summary>
        /// 批量识别
        /// </summary>
        public List<OcrResult> BatchRecognize(List<string> imagePaths, string language = "chi_sim")
        {
            var results = new List<OcrResult>();
            
            foreach (var imagePath in imagePaths)
            {
                Console.WriteLine($"正在处理: {Path.GetFileName(imagePath)}");
                var result = Recognize(imagePath, language);
                results.Add(result);
            }
            
            return results;
        }
        
        /// <summary>
        /// 配置引擎参数
        /// </summary>
        private void ConfigureEngine(TesseractEngine engine)
        {
            // 设置页面分割模式
            engine.SetVariable("tessedit_pageseg_mode", "3"); // 全自动
            
            // 设置白名单(可选)
            // engine.SetVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
            
            // 设置黑名单(可选)
            // engine.SetVariable("tessedit_char_blacklist", "!@#$%^&*()");
            
            // 设置OCR引擎模式
            engine.SetVariable("classify_bln_numeric_mode", "0");
        }
        
        /// <summary>
        /// 预处理图片
        /// </summary>
        public Pix PreprocessImage(string imagePath)
        {
            using (var original = Pix.LoadFromFile(imagePath))
            {
                    // 1. 转为灰度
                using (var gray = original.ConvertRGBToGray())
                {
                    // 2. 二值化
                    using (var binary = gray.BinarizeOtsuAdaptiveThreshold())
                    {
                        // 3. 降噪
                        using (var denoised = binary.RemoveNoise())
                        {
                            return denoised.Clone();
                        }
                    }
                }
            }
        }
    }
    
    /// <summary>
    /// OCR识别结果
    /// </summary>
    public class OcrResult
    {
        public bool Success { get; set; }
        public string Text { get; set; }
        public float Confidence { get; set; }
        public string EngineMode { get; set; }
        public string Language { get; set; }
        public string Message { get; set; }
        public string ErrorMessage { get; set; }
        
        public override string ToString()
        {
            if (!Success)
            {
                return $"识别失败: {ErrorMessage}";
            }
            
            return $"识别成功! 模式: {EngineMode}, 语言: {Language}, 置信度: {Confidence:P}\n" +
                   $"识别结果:\n{Text}\n" +
                   $"{(string.IsNullOrEmpty(Message) ? "" : $"备注: {Message}")}";
        }
    }
}

到此这篇关于C#使用Tesseract进行中文识别的全过程的文章就介绍到这了,更多相关C# Tesseract中文识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • winform C#获得Mac地址,IP地址,子网掩码,默认网关的实例

    winform C#获得Mac地址,IP地址,子网掩码,默认网关的实例

    下面小编就为大家带来一篇winform C#获得Mac地址,IP地址,子网掩码,默认网关的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C#常用日期时间方法汇总

    C#常用日期时间方法汇总

    这篇文章介绍了C#常用的日期时间方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 详解WPF如何动态生成DataGrid的行和列

    详解WPF如何动态生成DataGrid的行和列

    在日常开发中,DataGrid作为二维表格,非常适合数据的展示和统计,本文以一些简单的小例子,简述在WPF开发中,如何动态生成DataGrid的行和列,需要的可以了解下
    2024-02-02
  • C#实现发送邮件的三种方法

    C#实现发送邮件的三种方法

    这篇文章主要介绍了C#实现发送邮件的三种方法,实例讲述了Localhost,SMTP与SSL-SMTP三种实现方法,对于C#项目开发有不错的借鉴价值,需要的朋友可以参考下
    2014-11-11
  • C#简易图片格式转换器实现方法

    C#简易图片格式转换器实现方法

    这篇文章主要介绍了C#简易图片格式转换器实现方法,涉及C#基于WinForm操作图片的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 学会使用C#异常

    学会使用C#异常

    在C#中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”。 异常通常由错误的代码引发,并由能够更正错误的代码进行catch。本文将对C#异常简要分析说明,下面就跟着小编一起来看下吧
    2016-12-12
  • C#中Dictionary<TKey,TValue>排序方式的实现

    C#中Dictionary<TKey,TValue>排序方式的实现

    这篇文章主要介绍了C#中Dictionary<TKey,TValue>排序方式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • c# Struct的一些问题分析

    c# Struct的一些问题分析

    在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。结构体是用来代表一个记录。
    2021-06-06
  • C#中数组、ArrayList和List三者的区别详解

    C#中数组、ArrayList和List三者的区别详解

    这篇文章主要介绍了C#中数组、ArrayList和List三者的区别详解,对于三者之间的区别想要了解的可以进来了解一下。
    2016-12-12
  • C#绘制实时曲线的方法

    C#绘制实时曲线的方法

    这篇文章主要为大家详细介绍了C#绘制实时曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论