我正在尝试使用Tesseract进行单个字符识别,结果令人震惊。 “ h”被识别为“ n”,“ 4”被识别为“ / i”,“ O”被识别为“()”;
单字符模式似乎不起作用,因为许多字符被识别为两个字符, 不只是一个我的图像是简单的黑白黑白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吗?我没想到 简单的位图字体识别存在的问题,现在已经迷失了。 预先非常感谢您, 尤莉安娜
答案 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