为什么从Tesseract获得如此差的结果以进行简单的单字符识别?

时间:2018-10-15 19:13:35

标签: c++ ocr tesseract

我正在尝试使用Tesseract进行单个字符识别,结果令人震惊。 “ h”被识别为“ n”,“ 4”被识别为“ / i”,“ O”被识别为“()”;

h_char

4_char

O_char

单字符模式似乎不起作用,因为许多字符被识别为两个字符, 不只是一个我的图像是简单的黑白黑白TIFF图像, 拉丁字符。这是位图字体,不是扫描的图像,它们绝对干净且 不需要改善。 О大约只有一半的字符被正确识别,这似乎是 这样简单的任务的百分比非常低。

我正在使用的Tesseract库版本是“ 4.0.0-beta.3”。 这就是我所说的Tesseract。

 int CharRecognizer::recognizeTIFFData(char* data, int datalength){
            char *outText;
            TessBaseAPI* api = new TessBaseAPI();

            if (api->Init(NULL, "eng")) {
                    fprintf(stderr, "Could not initialize tesseract.\n");
                    exit(1);
            }
            api->SetPageSegMode(tesseract::PSM_SINGLE_CHAR);
            Pix *image = pixReadMem(data,datalength);
            api->SetImage(image);
            // Get OCR result
            outText = api->GetUTF8Text();
            printf("\nOCR output:\n%s", outText);
            // Destroy used object and release memory
            int utf8 = outText[0];
            api->End();
            delete[] outText;
            pixDestroy(&image);
            return utf8;
 }

我是Tesseract的新手,所以可能我缺少一些东西。我必须以某种方式训练吗  图书馆第一?可能我应该设置另一个OcrEngineMode吗?我没想到  简单的位图字体识别存在的问题,现在已经迷失了。 预先非常感谢您, 尤莉安娜

1 个答案:

答案 0 :(得分:1)

通过在图像周围添加1x1像素边框,我能够使tesseract在您的情况下产生正确的结果。我在Linux上使用tesseract命令行工具对此进行了测试:

$ tesseract R2a51.png stdout --psm 10
n
$ convert R2a51.png -border 1x1 R2a51.border.png
$ tesseract R2a51.border.png stdout --psm 10
h

convert工具用于创建带有边框的图像版本。

看来tesseract无法正确处理图像边缘的字符(至少使用默认设置)。

您的第三个字符仍然被识别为0而不是O,但是我不确定这是否可以视为OCR错误。您可能需要查看tesseract字符白名单来解决这个问题。

编辑: 似乎“ Tesseract传统算法”无需修改即可在您的图像上运行。可以通过--oem 0在命令行上调用它。请注意,*.traineddata目录中的语言需要匹配tessdata。可以从https://github.com/tesseract-ocr/tessdata

下载适当的变体
相关问题