在QT c ++

时间:2017-07-26 17:30:51

标签: c++ ocr tesseract

我在QT中使用Tesseract OCR c ++库从png图像中获取文本 使用此代码

const char* lang = "eng";
QString filename = "D:/image.png";

tesseract::TessBaseAPI tess;
tess.Init(NULL, lang, tesseract::OEM_DEFAULT);
tess.SetPageSegMode(tesseract::PSM_AUTO);

FILE* fin = fopen(filename.toStdString().c_str(), "rb");
if (fin == NULL)
{
    std::cout << "Cannot open " << filename.toStdString().c_str() << std::endl;
    return;
}
fclose(fin);

STRING text;
if (tess.ProcessPages(filename.toStdString().c_str(), NULL, 0, &text))
{
    ui->plainTextEdit->setPlainText(QString::fromUtf8(text.string()));
 //show result in plainttext qt gui

}

将数据放在表格中的数据不够准确,它给了我奇怪的字符,当我使用在线OCR网站将我的图像转换为文本(相同的图像)时,它完全100%准确,所以是什么使得它给了我这个错误的文本这是一个库的问题?还是我的代码?或者如果有更好的免费库我可以使用更准确吗?

我从pdf获得图像我使用ghost脚本来获得高质量的图像,因此OCR库应该能够获得正确的数据

2 个答案:

答案 0 :(得分:0)

我对cpp没有经验,但我认为你的问题很可能与下面的行有关:

tess.Init(NULL, lang, tesseract::OEM_DEFAULT);

必须显示tessdata文件夹。您可以编写文件夹名称,而不是NULL,例如"C:/tessdata/"。再一次,我对cpp没有经验,这就是为什么你可以决定斜杠“/”或反斜杠“\”。该文件夹应包含语言文件。

答案 1 :(得分:0)

正如Eddge在他的评论中提到的,你应该应用一些图像预处理的东西,scriptsimagemagick串。 Ans当然,OpenCV也会对这些东西有很大的帮助。

下一点可能是PSM模式,默认情况下应满足您提取整页信息的需求。

如您所述,在线OCR的结果也不是100%。

There is "1 S Days" instead of "15 Days"
There is "Mail: finance(a)" instead of "E Mail: finance@"
There is "TiA THE GREEN HOL1 5" instead of "T/A THE GREEN HOU 5"

您使用的是哪个Tesseract版本?我强烈建议使用3.05。 (4.0显示了更好的结果,但尚未正式发布)。

以下链接可以帮助您获得结果:https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality

P.S。我希望你有资格公开分享这些财务文件;)