You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用C#与Tesseract读取JPEG图片文本的技术咨询

关于tessnet2(Tesseract .NET封装)OCR的技术指导与代码优化

Hey there! Let's walk through your OCR code and share some practical tips to get it working reliably, plus a polished version you can test out.

首先,梳理现有代码里的关键注意点

  • 训练数据路径检查:你在ocr.Init里指定的路径需要确保包含tessdata子文件夹,且里面有eng.traineddata(英文训练包)。如果训练数据直接放在Oasis文件夹下,路径得调整,不然Tesseract会找不到训练文件导致初始化失败。
  • 资源泄漏风险BitmapTesseract实例都是非托管资源,不用using包裹会占用内存不释放,这点得修正。
  • 可选的字符白名单:如果目标图片只有数字,把注释掉的ocr.SetVariable("tessedit_char_whitelist", "0123456789");打开,而且要放在Init方法之前调用——初始化后再设置变量是不生效的,这能大幅提升数字识别的准确率。

优化后的完整可验证代码

这里整理了带图片预处理、资源释放和错误处理的版本,识别效果会更稳定:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using tessnet2;

class OcrDemo
{
    static void Main()
    {
        try
        {
            // 自动释放Bitmap资源
            using (var originalImage = new Bitmap(@"D:\Projects\Project Docs\Oasis\20180405T105834.618.jpeg"))
            // 自动释放Tesseract实例
            using (var ocrEngine = new Tesseract())
            {
                // 可选:设置字符白名单(仅识别数字,需放在Init之前)
                // ocrEngine.SetVariable("tessedit_char_whitelist", "0123456789");
                
                // 初始化OCR引擎:路径指向包含tessdata文件夹的目录,语言为英文,不启用字典
                ocrEngine.Init(@"D:\Projects\Project Docs\Oasis\", "eng", false);

                // 图片预处理:转灰度图(提升OCR识别率)
                using (var grayImage = ConvertToGrayscale(originalImage))
                {
                    // 对整张图片执行OCR
                    var ocrResults = ocrEngine.DoOCR(grayImage, Rectangle.Empty);

                    // 遍历输出所有识别到的内容
                    Console.WriteLine("识别结果:");
                    foreach (Word word in ocrResults)
                    {
                        Console.WriteLine($"文本: {word.Text} | 位置: {word.BoundingBox}");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            // 捕获并输出错误信息,方便排查问题
            Console.WriteLine($"OCR过程出现错误: {ex.Message}");
            Console.WriteLine($"错误详情: {ex.StackTrace}");
        }

        Console.Read();
    }

    // 辅助方法:将彩色图片转为灰度图
    private static Bitmap ConvertToGrayscale(Bitmap original)
    {
        var grayBitmap = new Bitmap(original.Width, original.Height);
        using (var g = Graphics.FromImage(grayBitmap))
        {
            // 灰度转换矩阵
            var colorMatrix = new ColorMatrix(new float[][]
            {
                new float[] {0.299f, 0.299f, 0.299f, 0, 0},
                new float[] {0.587f, 0.587f, 0.587f, 0, 0},
                new float[] {0.114f, 0.114f, 0.114f, 0, 0},
                new float[] {0, 0, 0, 1, 0},
                new float[] {0, 0, 0, 0, 1}
            });
            var attributes = new ImageAttributes();
            attributes.SetColorMatrix(colorMatrix);
            g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
                        0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);
        }
        return grayBitmap;
    }
}

额外的调试建议

  • 如果识别结果不理想,可以尝试对图片做更多预处理:比如二值化(转黑白)、缩放图片(放大小字体)、去除噪声。
  • 确认项目的平台目标(比如x86)和tessnet2.dll的版本匹配——很多tessnet2的预编译包是32位的,64位项目运行会报错。
  • 如果需要识别其他语言,只要把Init里的"eng"换成对应的语言代码(比如"chi_sim"对应简体中文),并放入对应的训练数据文件。

内容的提问来源于stack exchange,提问作者vijesh

火山引擎 最新活动