Tesseract OCR-如何训练像这样的图像

时间:2020-03-04 22:46:19

标签: c# asp.net-mvc ocr tesseract

我有一个包含.Net wrapper for tesseract-ocr nuget的MVC C#应用程序。我正在使用的当前版本是v4.1.0-beta1。我尝试扫描的图像如下所示

enter image description here

我的目的是提取玩家名称和左侧玩家上方的号码。

我尝试使OCR扫描场/音高区域,但结果偏离基准。因此,我决定将所有球员姓名和所有号码都分开,如下图所示。评分区域标记为蓝色,播放器名称标记为红色。如您所见,名称和等级始终保持相同的距离。

enter image description here

我当前的代码设置如下所示。

public void Get(HttpPostedFileBase file)
{
    using (var engine = new TesseractEngine(Path.Combine(HttpRuntime.AppDomainAppPath, "tessdata"), "eng+deu", EngineMode.Default))
    {
        var bitmap = (Bitmap)Image.FromStream(file.InputStream, true, true);

        using (var img = PixConverter.ToPix(bitmap))
        {
            SetPlayerRatings(engine, img);
        }
    }
}

private void SetPlayerRatings(TesseractEngine engine, Pix img)
{
    var width = 285;
    var height = 76;

    var textPositions = Service.Get<Formation>(this.FormationId).TextPositions.ToList();

    foreach (var textPosition in textPositions)
    {
        var playerRating = GetPlayerData(engine, img, new Rect(textPosition.X, textPosition.Y, width, height));
    }
}

private static PlayerRating GetPlayerData(TesseractEngine engine, Pix img, Rect region)
{
    using (var page = engine.Process(img, region, PageSegMode.Auto))
    {
        var playerName = page.GetText();
    }

    var ratingRegion = new Rect(region.X1, region.Y1 - 52, 80, 50);

    using (var page = engine.Process(img, ratingRegion, PageSegMode.Auto))
    {
        var playerRating = page.GetText();
    }
}

此代码为第一张图像产生正确的结果。

enter image description here

有没有什么方法可以训练OCR,这样我就不必锻炼每个球员位置的X和Y坐标?我只想指定音高的区域,并让OCR读入等级,再加上球员姓名。

1 个答案:

答案 0 :(得分:0)

通过指定坐标,您解决了有关image processing的几个问题。因此,如果您不想指定坐标,则必须处理它们:从OCR区域中删除图形组件,例如T恤,线条。

下一个想法:Tesseract API具有选项GetComponentImages(我希望C#包装程序也应该提供它-我对C#不熟悉),因此您可以遍历找到的组件。