正方体 OCR 文本位置

Posted

技术标签:

【中文标题】正方体 OCR 文本位置【英文标题】:Tesseract OCR Text Position 【发布时间】:2018-12-19 07:14:59 【问题描述】:

我正在使用 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());

                        
                    
                
            

这是一个显示错误间距的输入和输出示例。

【问题讨论】:

我已经附上了我的输入和输出文件。输入中单词之间的间距在输出文件中必须相似 我正在使用 teceract 制作一个 POC 类型的项目。你能指导一下我应该参考哪个文件吗?让你简单阅读 【参考方案1】:

您可以使用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);

【讨论】:

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

以上是关于正方体 OCR 文本位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中使用OCR从图像中获取文本识别器的坐标

如何按位置对矩形数组进行排序?

用于 OCR 的场景文本图像超分辨率

使用 iPhone 摄像头识别特定位置的文本

正方体 OCR 相机

正方体 OCR 到 PAGE