在c#中的winform应用程序中获取在OCR期间提取的第一个字母的坐标

Posted

技术标签:

【中文标题】在c#中的winform应用程序中获取在OCR期间提取的第一个字母的坐标【英文标题】:get coordinates of the first alphabet extracted during OCR in winform application in c# 【发布时间】:2018-11-21 00:45:26 【问题描述】:

是否有任何方法或任何 DLL 可以让我在 Windows 窗体应用程序 C# 中使用 OCR 找到第一个字母或字母的位置或坐标,而无需对整个文档执行 OCR?

由于我使用 Aspose 和 tesseract Dll 对图像执行 OCR。提取文本需要时间,因为它会读取所有文本,但我只想读取第一个单词并获取提取的第一个字母的坐标。我必须使用 C# 在 Windows 窗体应用程序中实现它。请帮忙。 提前致谢!

【问题讨论】:

使用 Emgu.CV.... @NicoRiff 谢谢,但你能告诉我怎么做吗?当我在官方和相关网站上查找文件时,我无法弄清楚如何获取页面首字母的位置和坐标。例如。我有一个将页码作为最顶层项目的文档,所以我想获取页码的位置,而不需要经过整个页面的 OCR 过程。 您可以尝试使用分段算法来尝试查找文本区域,然后选择最顶部的文本区域并在这些特定边界上执行 OCR。但是不确定 Tesseract 是否提供该功能。如果您认为这是可行的,请告诉我,我可以提供一些示例代码作为如何实现此目的的答案。 @hcham1 请提供示例代码,看看它们是否有效 我回答了,但请注意答案引用了付费 SDK。如果这不是您想要的,请告诉我,我可以删除我的答案。 【参考方案1】:

作为免责声明,此答案是关于付费软件工具包,我为公司工作。

您可以查看LEADTOOLS SDK,它具有我在评论中提到的分割算法来划分文档,然后找到最左上角的文本区域并在这些边界上执行 OCR。

我编写了一个控制台应用程序来展示如何使用 LEADTOOLS OCR NuGet 实现此目的的示例: https://www.nuget.org/packages/Leadtools.Ocr/

using Leadtools;
using Leadtools.Codecs;
using Leadtools.ImageProcessing.Core;
using Leadtools.Ocr;
using System;
using System.Linq;

namespace FindFirstZone

    class Program
    
        static IOcrEngine ocrEngine;
        static RasterCodecs codecs;

        static void Main(string[] args)
        
            Initialize();
            var image = codecs.Load(@"randomtext.png");
            LeadRect rect = FindFirstZone(image);
            DoOcr(image, rect);
            Console.ReadLine();
        

        static void Initialize()
        
            RasterSupport.SetLicense(@"C:\LEADTOOLS 20\Common\License\LEADTOOLS.LIC",
                System.IO.File.ReadAllText(@"C:\LEADTOOLS 20\Common\License\LEADTOOLS.LIC.KEY"));

            codecs = new RasterCodecs();

            ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, false);
            ocrEngine.Startup(null, null, null, null);
        

        static LeadRect FindFirstZone(RasterImage img)
        
            AutoZoningCommand autoZoningCommand = new AutoZoningCommand(
                AutoZoningOptions.DetectAccurateZones |
                AutoZoningOptions.DetectText |
                AutoZoningOptions.DontAllowOverlap);
            autoZoningCommand.Run(img);

            if (autoZoningCommand.Zones != null && autoZoningCommand.Zones.Count > 0)
            
                var sortedList = autoZoningCommand.Zones.OrderBy(z => z.Bounds.Top)
                    .ThenBy(z => z.Bounds.Left).ToList();
                return sortedList[0].Bounds;
            
            else
                throw new Exception("No Zones");
        

        static void DoOcr(RasterImage image, LeadRect rect)
        
            using (var ocrPage = ocrEngine.CreatePage(image, OcrImageSharingMode.None))
            
                ocrPage.Zones.Add(new OcrZone()
                
                    Bounds = rect,
                    ZoneType = OcrZoneType.Text,
                );
                ocrPage.Recognize(null);
                Console.WriteLine(ocrPage.GetText(-1));
            
        
    

我用我生成的一些随机文本 (test image here) 对此进行了测试,这是该程序的输出:

牛它天上二不事不三牛自。曾说过 补上晚上,一个说他很棒的人

【讨论】:

此 SDK 是否可用于演示目的,即不提供任何计费明细。仅用于演示 是的,leadtools.com 网站上有 60 天免费试用,您只需要您的姓名和电子邮件。

以上是关于在c#中的winform应用程序中获取在OCR期间提取的第一个字母的坐标的主要内容,如果未能解决你的问题,请参考以下文章

在 TextReconiger 上实例化期间,我如何处理由于 Google Ocr lib 而导致的应用程序中的本机崩溃?

在c#的winform 下怎么读取 xml文件中的数据?

C# MODI 错误:图像中的 OCR 文本

如何在 C# Winform 中专门在 Wndproc 中获取 IME 布局?

C# Winform 模拟无法正常工作

C# winform程序中 如何获取和设置dataGridView1的垂直滚动条当前位置?