带有 Tesseract OCR 的 EmguCV 甚至无法识别二进制黑白单字符图像
Posted
技术标签:
【中文标题】带有 Tesseract OCR 的 EmguCV 甚至无法识别二进制黑白单字符图像【英文标题】:EmguCV with Tesseract OCR fails to recognize even binary black-white single character images 【发布时间】:2020-10-25 09:33:26 【问题描述】:我正在尝试使用 EmguCV .NET 包装器让 OCR 与 Tesseract 一起工作。因为它没有识别出看起来很简单的情况,所以我继续下载了命令行工具本身 here 并确认它的行为方式与 Emgu 包装器相同,所以这不是库的错,这似乎是我使用它的方式或 tesseract 本身。我也从上面的链接中获得了官方 tesseract 安装二进制文件中的 eng.traineddata。
tesseract v5.0.0-alpha.20200328
leptonica-1.78.0
我的代码示例:
var testBitmap = Screenshot.MakeCroppedBitmap(LeftPoint, ScreenshotSize); // takes partial screenshot
Tesseract ocr = new Tesseract(Tesseract.DefaultTesseractDirectory, "eng", OcrEngineMode.Default);
ocr.PageSegMode = PageSegMode.SingleChar;
Image<Bgr, byte> emguImageOCR = testBitmap.ToImage<Bgr, byte>();
Image<Gray, byte> emguImageOCRGray = emguImageOCR.Convert<Gray, byte>();
emguImageOCRGray._ThresholdBinary(new Gray(235), new Gray(255));
ocr.SetImage(emguImageOCRGray);
ocr.Recognize();
Console.WriteLine(ocr.GetUTF8Text());
emguImageOCRGray.Save("this-is-what-I-tried-to-read.png");
testBitmap.Dispose();
emguImageOCR.Dispose();
emguImageOCRGray.Dispose();
它认为这是一个点。 .
可能是因为 Z 上方的字面点。
它认为这是一个i
。
这些只是 2 个示例。完整的句子也会出错,但并非总是如此。有些案例是正确的。我在这里做错了什么?这一定是我的错,我没有办法使用这个权利。
编辑:我认为它不起作用的原因是因为我的火车数据文件没有使用我在此示例中使用的字体进行训练。我需要找到一种方法来创建包含正确字体的新火车数据。我还没有找到任何 Windows 指南,只有 Linux 并且仅适用于 Tesseract v3.x。
Edit2:我在获取具有所需字体的火车数据方面得到了一些帮助。我还添加了一个高斯平滑步骤来减少二值图像的颗粒度。可悲的是,该模型仍然预测不到一半的案例错误。我不知道如何仅使用 CV 来解决这个问题。
【问题讨论】:
【参考方案1】:在您的帖子中,您谈到了获取 tessdata 文件,我假设您是从这里的 github 链接https://github.com/tesseract-ocr/tessdata 获得的。
随着 Tesseract 和 Emgucv 的最新更新,以前被破坏的功能现在可以使用,称为白名单。
您创建一个可以处理所有与 OCR 引擎相关的值和函数的函数,然后在实际使用它之前调用它。
public static void LoadOCREngine(String dataPath)
//create OCR engine
_ocr = new Tesseract(dataPath, "eng", OcrEngineMode.TesseractCubeCombined);
_ocr.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ-1234567890");
您将路径传递给您的 tessdata 文件,然后您可以指定要检测的字符,忽略所有其他字符。如果确实出现错误,我建议将 OcrEngineMode 更改为另一个可用选项。
再次从您的帖子中,通过所有过滤器后的最终图像看起来相当不错,所以我认为这与此无关,但在过去的经验中,仅启用白名单功能就会看到巨大的峰值Tesseract 的准确性。
【讨论】:
以上是关于带有 Tesseract OCR 的 EmguCV 甚至无法识别二进制黑白单字符图像的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 tesseract OCR 识别带有小数学符号的文本?
Pytesseract (Tesseract OCR) 没有收到一些数字