不准确的Tesseract OCR数据C++
我使用QT的Tesseract OCR C++库使用此代码不准确的Tesseract OCR数据C++
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
}
把数据不够准确的获得从一个PNG图像 文本在表中的数据,它给了我奇怪的字符,当我使用在线OCR网站将我的图像转换为文本(相同的图像),它以100%的准确性做到了,所以它给了我这个错误的文字是这个问题与图书馆?或我的代码?或者如果有更好的免费图书馆,我可以用它来更准确?
我从PDF图像我用ghost脚本以优良的品质获得图像,从而使OCR库应该得到我正确的数据
我我没有经历过CPP,但我认为你的问题很可能与下面的线有关:
tess.Init(NULL, lang, tesseract::OEM_DEFAULT);
它必须显示tessdata
文件夹。而不是NULL
,您可以编写文件夹名称,例如"C:/tessdata/"
。再一次,我没有经历cpp,这就是为什么你可以决定斜杠“/”或反斜杠“\”。该文件夹应该包含语言文件。
我将null更改为tessdata文件夹,但同样的问题 –
也许是{const char * lang =“eng”;}行。你可以改变它为{字符串}?或者,您可以将该行更改为:{tess.Init(“c:/ tessdata /”,“eng”,3);} – nes
由于Eddge在他的评论中提到你应该使用一些图像预处理的东西,有scripts为imagemagick一堆。 答案当然OpenCV在这方面也会有很大的帮助。
下一点可能是PSM模式,默认情况下它应该满足您提取整页信息的需要。
此外,在线OCR的结果并不像您提到的那样是100%。
There is "1 S Days" instead of "15 Days"
There is "Mail: finance(a)" instead of "E Mail: [email protected]"
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
附:我希望你有资格公开分享这样的财务文件;)
OCR的不准确性并不取决于Qt,这取决于进行计算的类,所以我看到Qt标记无关紧要。 – eyllanesc
你在处理你的页面之前是否尝试进行任何预处理?如果你看他们的论坛,有几位用户提到你应该用黑白图像(白色背景上的黑色字体)尝试它,你的文本周围有很多模糊的东西,你应该尝试预处理它,在线OCR最有可能的是自动编辑图像并删除这些图像。 – Eddge
是的我使用Ghostscript从这个属性获取PDF文件的图像-dFirstPage = 1 -dLastPage = 1 -dBATCH -dNOPAUSE -sDEVICE = pnggray -r300 -dUseCropBox –