2017-07-26 79 views
0

我使用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库应该得到我正确的数据

+3

OCR的不准确性并不取决于Qt,这取决于进行计算的类,所以我看到Qt标记无关紧要。 – eyllanesc

+0

你在处理你的页面之前是否尝试进行任何预处理?如果你看他们的论坛,有几位用户提到你应该用黑白图像(白色背景上的黑色字体)尝试它,你的文本周围有很多模糊的东西,你应该尝试预处理它,在线OCR最有可能的是自动编辑图像并删除这些图像。 – Eddge

+0

是的我使用Ghostscript从这个属性获取PDF文件的图像-dFirstPage = 1 -dLastPage = 1 -dBATCH -dNOPAUSE -sDEVICE = pnggray -r300 -dUseCropBox –

回答

0

我我没有经历过CPP,但我认为你的问题很可能与下面的线有关:

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

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

+0

我将null更改为tessdata文件夹,但同样的问题 –

+0

也许是{const char * lang =“eng”;}行。你可以改变它为{字符串}?或者,您可以将该行更改为:{tess.Init(“c:/ tessdata /”,“eng”,3);} – nes

0

由于Eddge在他的评论中提到你应该使用一些图像预处理的东西,有scriptsimagemagick一堆。 答案当然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

附:我希望你有资格公开分享这样的财务文件;)