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

时间:2018-06-11 17:36:50

标签: c# winforms ocr

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

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

1 个答案:

答案 0 :(得分:0)

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

您可以签出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)随机文本进行了测试,这是该程序的输出:

  

家禽天堂,第二只别的东西不会第三只牛。说了   充满带来晚上,一个说他很棒