Tesseract OCR - Как тренироваться для подобного изображения - PullRequest
5 голосов
/ 05 марта 2020

У меня есть приложение MVC C#, которое включает в себя оболочку . Net для tesseract-ocr nuget . Текущая версия, которую я использую, 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();
    }
}

Этот код дает правильные результаты для 1-го изображения.

enter image description here

Есть ли способ тренировать OCR, чтобы мне не приходилось тренировать координаты X и Y для каждой позиции игрока? Я хотел бы просто указать площадь поля и прочитать OCR в рейтинге, а затем имя игрока.

1 Ответ

0 голосов
/ 09 марта 2020

С указанием координат вы решили несколько задач, касающихся обработки изображений . Поэтому, если вы не хотите указывать координаты, вы должны иметь с ними дело: например, удалить графический компонент из области распознавания, например футболку, линии.

Следующая идея: в Tesseract API есть опция GetComponentImages (Я ожидаю, что C# обертка тоже должна это предоставить - я не знаком с C#), поэтому вы можете перебирать найденные компоненты.

...