Tesseract OCR 文字位置

13

我正在使用Tesseract进行OCR。我已经让应用程序工作并获得了输出。这里我正在尝试从发票账单中提取数据并获取提取的数据。但是输入中单词之间的间距在输出文件中必须相似。现在我已经获取了每个单词和坐标。我需要根据坐标导出到文本文件。

代码示例:

            using (var engine = new TesseractEngine(Server.MapPath(@"~/tessdata"), "eng", EngineMode.Default))
            {
                engine.DefaultPageSegMode = PageSegMode.AutoOsd;
                // have to load Pix via a bitmap since Pix doesn't support loading a stream.

                using (var image = new System.Drawing.Bitmap(imageFile.PostedFile.InputStream))
                {

                    Bitmap bmp = Resize(image, 1920, 1080);

                    using (var pix = PixConverter.ToPix(image))
                    {
                        using (var page = engine.Process(pix))
                        {
                            using (var iter = page.GetIterator())
                            {
                                iter.Begin();
                                do
                                {
                                    Rect symbolBounds;
                                    string path = Server.MapPath("~/Output/data.txt");
                                    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out symbolBounds))
                                    {
                                        // do whatever you want with bounding box for the symbol

                                    var curText = iter.GetText(PageIteratorLevel.Word);

                                        //WriteToTextFile(curText, symbolBounds, path);
                                        resultText.InnerText += curText;
                                        // Your code here, 'rect' should containt the location of the text, 'curText' contains the actual text itself
                                    }
                                } while (iter.Next(PageIteratorLevel.Word));
                            }


                            meanConfidenceLabel.InnerText = String.Format("{0:P}", page.GetMeanConfidence());

                        }
                    }
                }
            }

这里是一个输入输出不正确的空格示例。 输入 输出

我已经附上了我的输入和输出文件。输出文件中单词之间的间距必须与输入文件相似。 - ab2015
我正在使用Tesseract制作一个POC类型的项目。请问您能指导我参考哪个文档以便制作简单易懂的阅读材料吗? - Prashant Pimpale
1个回答

13

您可以使用page.GetIterator()遍历页面中找到的项目。针对每个单独的项目,您可以获取一个“边界框”,这是一个Tesseract.Rect(矩形结构体),其中包含:X1Y1X2Y2坐标。

Tesseract.PageIteratorLevel myLevel = /*TODO*/;
using (var page = Engine.Process(img))
using (var iter = page.GetIterator())
{
    iter.Begin();
    do
    {
        if (iter.TryGetBoundingBox(myLevel, out var rect))
        {
            var curText = iter.GetText(myLevel);
            // Your code here, 'rect' should containt the location of the text, 'curText' contains the actual text itself
        }
    } while (iter.Next(myLevel));
}

在输出文本中使用输入位置进行空格的方法并不明确。您需要编写一些自定义逻辑来解决这个问题。

您可能可以通过类似以下内容的方式来估计文本左侧所需的空格数量:

var padLeftSpaces = (int)Math.Round((rect.X1 / inputWidth) * outputWidthSpaces);

1
@ab2015,我已经回答了你的问题,希望你能自己修复代码,因为你更熟悉它。 - GWigWam
iter.TryGetBoundingBox(myLevel, out var rect)。myLevel未声明。 - ab2015
myLevel是一个类型为Tesseract.PageIteratorLevel的变量,你需要自己选择一个。你可能想使用PageIteratorLevel.Word或者PageIteratorLevel.TextLine - GWigWam
现在我有每个单词和它们的坐标。我需要根据它们的坐标将这些单词写入文本文件中。你能帮我吗? - ab2015
@ab2015 我已经更新了我的答案并提供了一些提示。希望你能自己实现完整的解决方案。 - GWigWam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接